Newsgroup: it.comp.lang.visual-basic
Titolo: Curiosità su file BMP e PDF

Uso il vecchio paint per disegnare dei loghi.
 
Con vb6 ed un modulo di classe di Luigi Micco
creo dei files PDF per ordini, ddt e fatture che
posso poi inviare per email.
 
L'altro giorno un mio cliente ha disegnato un nuovo
logo (probabilmente non con paint).
 
Questo logo, principalmente di colore rosso, diventa
di colore blù quanto viene inserito nel file PDF nel
modo sopradescritto.
 
Ho già risolto ridisegnando il logo con paint però
mi rimane la curiosità di sapere cosa poteva
causare il cambio di colore.
 
Qualche idea?
 
Grazie e saluti a tutti.
Sauro 
 
 

 causare il cambio di colore.
 
Mah... sei sicuro che fosse un vero BMP ? fagli l'autopsia con un
hex editor e controlla le intestazioni, e' un po' che non ci "gioco"
ma mi pare di ricordare che il "filtro" windows di importazione delle
immagini non verifica se (esempio) un'immagine codificata in PNG
ha estensione BMP o JPG, ovvio che se il modulo di cui parli (che
non conosco) ammette un palette max di (sempre per esempio) 256
colori 8 bit ma l'immagine e' in origine codificata con qualche
palette "esotica" (es. le palette delle GIF che possono avere
un  numero di colori semi-arbitrario)....

 
"Franz_aRTiglio ha scritto nel messaggio

Non sono in grado di fare il controllo di cui parli
in quanto non conosco la struttura interna dei vari
file immagine.
 
Quel che posso dire è che il LoadPicture di vb6 lo
legge bene.
 
Di seguito riporto una funzione di quel modulo di
classe di cui parlavo.
Magari tu ci capisci qualcosa.
 
Private Function LeggeBMP(FileName As String, _
                         ByRef ImgBuf() As Byte, _
                         ByRef ImgColor() As Byte, _
                         ByRef ImgWidth As Long, _
                         ByRef ImgHeight As Long, _
                         ByRef ImgBPP As Byte, _
                         Optional ColorSpace As pdfColorSpace = pdfRGB) As 
Boolean
 
  ' BITMAPFILEHEADER_Type
  Dim bfType          As String * 2     ' The string "BM" (hex value 
&H424D).
  Dim bfSize          As Long           ' The size of the file, measured in 
[Bytes].
  Dim bfDummy         As Integer        ' Not used, set to zero.
  Dim bfOffBits       As Long           ' The start offset of the bitmap 
data in the file.
 
  ' BITMAPINFOHEADER
  Dim biSize            As Long         ' 40 (the size of this structure).
  Dim biWidth           As Long         ' The width of the bitmap in pixels.
  Dim biHeight          As Long         ' The height of the bitmap in 
pixels.
  Dim biPlanes          As Integer      ' 1 (DIBs always have one plane).
  Dim biBitCount        As Integer      ' 1 for monochrome, 4 for 16 colors, 
8 for 256 color, 24 for 24-bit RGB color.
  Dim biCompression     As Long         ' Specifies the type of compression 
for compressed
  Dim biSizeImage       As Long         ' The size of the image in bytes.
  Dim biXPelsPerMeter   As Long         ' Number of horizontal pixels per 
meter for
  Dim biYPelsPerMeter   As Long         ' Number of vertical pixels per 
meter for
  Dim biClrUsed         As Long         ' Number of entries in the DIB color 
table
  Dim biClrImportant    As Long         ' Number of entries in the DIB color 
table that
 
 
  Dim c As Long
  Dim fb As Integer
  Dim XBMP As Long
  Dim BPP As Byte
  Dim i As Long
  Dim KK As Long
  Dim blnFlag As Boolean
  Dim TempImg() As Byte
  Dim TempCol() As Byte ' RGBQUAD_Type
  Dim lngGray As Long
 
  fb = FreeFile
  Open FileName For Binary As #fb
 
  ' BITMAPFILEHEADER
  Get #fb, , bfType
  Get #fb, , bfSize
  Get #fb, , bfDummy
  Get #fb, , bfDummy
  Get #fb, , bfOffBits
 
  LeggeBMP = False
 
  If bfType = "BM" Then
 
    ' BITMAPINFOHEADER
    Get #fb, , biSize
    Get #fb, , biWidth
    Get #fb, , biHeight
    Get #fb, , biPlanes
    Get #fb, , biBitCount
    Get #fb, , biCompression
    Get #fb, , biSizeImage
    Get #fb, , biXPelsPerMeter
    Get #fb, , biYPelsPerMeter
    Get #fb, , biClrUsed
    Get #fb, , biClrImportant
 
 
    BPP = biBitCount
 
    If BPP <= 8 Then
 
      ' legge la palette di colori
      ReDim TempCol(1 To (2 ^ BPP) * 4)
      Get #fb, , TempCol()
 
      If ColorSpace = pdfRGB Then
        ReDim ImgColor(1 To 3 * (2 ^ BPP))
        For c = 0 To (2 ^ BPP) - 1
          ImgColor(c * 3 + 1) = TempCol(c * 4 + 1) ' red
          ImgColor(c * 3 + 2) = TempCol(c * 4 + 2) ' green
          ImgColor(c * 3 + 3) = TempCol(c * 4 + 3) ' blue
        Next
      Else
        ReDim ImgColor(1 To (2 ^ BPP))
        For c = 0 To (2 ^ BPP) - 1
          lngGray = (0.33 * TempCol(c * 4 + 1) + 0.59 * TempCol(c * 4 + 2) + 
0.11 * TempCol(c * 4 + 3))
          ImgColor(c + 1) = IIf(lngGray > 255, 255, lngGray)
        Next
      End If
    End If
 
    XBMP = ((biWidth * BPP / 8) + 3&) And &HFFFFFFFC      ' [Bytes].
 
    ImgWidth = biWidth
    ImgHeight = biHeight
    ImgBPP = CByte(biBitCount)
 
    ReDim TempImg(1 To biHeight * XBMP)
    Get #fb, bfOffBits + 1, TempImg()
    Close #fb
 
    ReDim ImgBuf(1 To biHeight * XBMP)
    KK = 0
 
    If BPP > 8 Then
      blnFlag = ((biWidth Mod 4) <> 0)
 
      If ColorSpace = pdfRGB Then
        For c = 1 To UBound(TempImg) - 1 Step 3
          ImgBuf(3 * KK + 1) = TempImg(c + 2)
          ImgBuf(3 * KK + 2) = TempImg(c + 1)
          ImgBuf(3 * KK + 3) = TempImg(c)
          If (((KK + 1) Mod biWidth) = 0) And blnFlag Then c = c + (biWidth 
Mod 4)
          KK = KK + 1
        Next
 
      Else
        For c = 1 To UBound(TempImg) - 1 Step 3
          lngGray = 0.33 * TempImg(c + 2) + 0.59 * TempImg(c + 1) + 0.11 * 
TempImg(c)
          ImgBuf(KK + 1) = IIf(lngGray > 255, 255, lngGray)
          If (((KK + 1) Mod biWidth) = 0) And blnFlag Then c = c + (biWidth 
Mod 4)
          KK = KK + 1
        Next
        ReDim Preserve ImgBuf(1 To KK)
 
      End If
 
    ElseIf BPP <= 8 Then
      blnFlag = (biWidth Mod IIf(BPP = 8, 4, 8)) <> 0
      For i = 1 To UBound(TempImg)
        ImgBuf(KK + 1) = TempImg(i)
        If ((KK + 1) Mod Int((biWidth + (8 / BPP) - 1) / (8 / BPP))) = 0 And 
blnFlag Then
          i = i + (XBMP - (i Mod XBMP))
        End If
        KK = KK + 1
      Next
      ReDim Preserve ImgBuf(1 To KK)
 
    End If
 
    LeggeBMP = True
  End If
 
  If fb > 0 Then Close #fb
 
End Function
 
 
 
Ciao Franz e grazie.
Sauro 
 
 


 
all'offset 16: "Nella versione 5 del formato sono ammessi inoltre i 
seguenti valori:" ... png ... jpg
 
La mia idea iniziale è plausibile se il modulo che stai usando non
considera/conosce il formato versione 5.
 
Nei tuoi panni i caricherei l'immagine in una variabile con loadpicture
(che se non ricordo male usa l'api di windows, qiondi se il S.O. può
leggere l'immagine loadpicture restituisce l'immagine bell'ePPronta
senza problemi di formato/encoding originale); alla peggio userei
l'oggetto webbrowser (che è piu versatile nel caricare l'immagine).

Franz_aRTiglio ha usato la sua tastiera per scrivere :
 
visto or ora (m'era sfuggito):
 
offset 14 "profondità di colore dell'immagine in bit per pixel, 
dev'essere uno dei seguenti valori: 1, 4, 8, 16, 24 o 32. In caso di 1, 
4 o 8 bit per pixel i colori sono indicizzati. I valori 16 e 32 sono 
poco comuni. Nella versione 5 del formato si può usare il valore 0 
quando viene incapsulata un'immagine JPEG o PNG."
 
 
  If bfType = "BM" Then
 
    ' BITMAPINFOHEADER
    Get #fb, , biSize
    Get #fb, , biWidth
    Get #fb, , biHeight
    Get #fb, , biPlanes
    Get #fb, , biBitCount
    Get #fb, , biCompression
    Get #fb, , biSizeImage
    Get #fb, , biXPelsPerMeter
    Get #fb, , biYPelsPerMeter
    Get #fb, , biClrUsed
    Get #fb, , biClrImportant
 
 
    BPP = biBitCount
 
    If BPP <= 8 Then
 
scommetto che nell'immagine "incriminata" biBitCount ( e quindi BPP )
risulta zero, il modulo da te postato dà per scontato che se e' 
inferiore o uguale a 8, BPP e' per forza 1 o 4 e si regola di 
conseguenza, senza considerare che può essere una palette di tipo jpg o 
png, non mi stupirei di scorire che poi scazza quando conta con
 biClrUsed e biClrImportant.

[cut]
 
Ho capito che la routine di Luigi Micco non č perfetta.
 
Non riesco perň a seguirti nel dettaglio dei tuoi argomenti.
 
Mi sembra perň di capire che il file BMP non sia una semplice
rappresentazione dell'immagine con una propria lingua; ma
conservi invece caratteristiche diverse a seconda dell'applicazione
con la quale č stato creato (o del formato originale dell'immagine).
 
E' cosě?


 con la quale è stato creato (o del formato originale dell'immagine).
 
Non esattamente: il formato si è evoluto e sono stati introdotti
dei metodi che all'epoca della routine di micco erano sconosciuti, 
ovvio
che la routine, non conoscendo queste nuove caratteristiche interpreta
il flusso dati così come è "abituato", i nuovi programmi (anche il
semplice paint) invece conoscono i nuovi metodi e li usano attivamente.
 
Quindi (in semplice) il problema è che stai usanto una tecnica obsoleta
per manipolare delle informazioni scritte con metodi piu aggiornati.

 per manipolare delle informazioni scritte con metodi piu aggiornati.
 
ok
Grazie Franz
Sauro