Differenze tra le versioni di "Struttura del formato BMP"
(13 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 2: | Riga 2: | ||
Del formato ''BMP'' esistono tre versioni: la 3, la 4 e la 5. | Del formato ''BMP'' esistono tre versioni: la 3, la 4 e la 5. | ||
− | |||
− | |||
==Struttura del file BMP== | ==Struttura del file BMP== | ||
Il file di formato ''.bmp'' è sostanzialmente composto da tre blocchi: | Il file di formato ''.bmp'' è sostanzialmente composto da tre blocchi: | ||
− | * quello iniziale (''bitmapfileheader''), formato da 14 byte, che contiene informazioni sul file medesimo | + | * quello iniziale (''bitmapfileheader''), formato da 14 byte, che contiene informazioni sul file medesimo. |
− | * il ''bitmapinfoheader'', formato da 40 byte, che contiene informazioni generiche sull'immagine | + | * il ''bitmapinfoheader'', formato da 40 byte, che contiene informazioni generiche sull'immagine. Con le versioni 4 e 5 tale blocco finale è stato ampliato con l'aggiunta di nuovi campi in coda. |
− | + | * quello finale che contiene i dati veri e propri relativi ai colori di ciascun pixel. | |
Per la struttura in dettaglio rinviamo alla relativa [http://it.wikipedia.org/wiki/Windows_bitmap#Struttura esposizione presente in Wikipedia]. | Per la struttura in dettaglio rinviamo alla relativa [http://it.wikipedia.org/wiki/Windows_bitmap#Struttura esposizione presente in Wikipedia]. | ||
+ | V'è da precisare che l'ordine di impostazione dei byte in un file ''.bmp'' è ''little-endian''. | ||
+ | |||
+ | ===Analisi del blocco dei pixel che compongono l'immagine=== | ||
+ | Prenderemo in considerazione un file ''.bmp'' a colori con risoluzione a 24 bit (quindi il colore di ogni pixel viene definito da 3 byte. Il che significa che il pixel stesso è definito da 3 byte). Come abbiamo già visto, i dati specifici (3 byte) riguardanti il colore di ciascun pixel, costituente l'immagine, sono custoditi nel terzo blocco del file. | ||
+ | <BR>Ciascun gruppo di 3 byte è appartenente all'altezza (''Height'') dell'immagine e quindi - se vogliamo dire - contribuisce a definire una colonna di pixel. | ||
+ | <BR>L'insieme dei gruppi di 3 byte, che definiscono i colori dei pixel, formano la dimensione della lunghezza (''Width'') in pixel dell'immagine, o - se vogliamo dire - una riga. | ||
+ | <BR>Il numero dei dati-byte, relativi ai colori dei pixel di <SPAN style="text-decoration:underline">ciascuna riga di pixel</span>, deve essere sempre uguale ad un numero multiplo di 4. In caso contrario si aggiungono alla riga dei byte dei colori tanti byte zero quanti ne mancano per raggiungere il numero più prossimo multiplo di 4. | ||
+ | ====Esempio pratico==== | ||
+ | Prendiamo come semplice esempio un file immagine in formato ''BMP'' composto da 3 pixel in lunghezza (tre colonne) e da 3 pixel in altezza (tre righe). Tutti i byte hanno valore FF, ad indicare che l'immagine è completamente di colore bianco. Ogni riga che compone il reticolo dell'immagine, dunque, sarà inizialmente formata da 9 <U>byte</u> (3 byte * 3 pixel). Ma 9 ''non'' è un multiplo di 4, e pertanto si dovranno aggiungere tanti byte zero quanti sono necessari per raggiungere il numero più vicino al 9 che sia un multiplo di 4, ossia il 12. Quindi si dovranno aggiungere per <SPAN style="text-decoration:underline">ciascuna riga di pixel</span> ben 3 byte di valore zero. | ||
+ | <BR>Così la struttura di tale blocco in questo esempio sarà il seguente: | ||
+ | |----------9 byte--------| | ||
+ | .........FF FF FF FF FF FF FF FF FF <FONT color=B222222>00 00 00</font> FF FF | ||
+ | FF FF FF FF FF FF FF <FONT color=B222222>00 00 00</font> FF FF FF FF FF FF FF | ||
+ | FF FF <FONT color=B222222>00 00 00</font> | ||
+ | Questa regola vale anche nel caso di un'immagine rettangolare, poiché essa si applica soltanto all'insieme dei gruppi di 3 byte che impostano il colore dei relativi pixel e che compogono una ''riga'', ossia la lunghezza (''width'') in pixel della immagine. | ||
+ | |||
+ | |||
+ | ===Esempio disposizione dei byte di un file BMP completo=== | ||
+ | Vediamo ora l'esempio del file precedentemente rappresentato, ossia di un file immagine di formato ''BMP'' a colori con risoluzione a 24 bit e di dimensioni 3 x 3 pixel tutti di colore bianco: | ||
+ | <FONT color=red>42 4D 9E 00 00 00 00 00 00 00 7A 00 00 00 </font> primo blocco: ''bitmap file header'' | ||
+ | |||
+ | <FONT color=006400><B>6C 00 00 00</b> 03 00 00 00 03 00 00 00 01 00 </font> secondo blocco: ''bitmap info header'' | ||
+ | <FONT color=006400>18 00 00 00 00 00 24 00 00 00 13 0B 00 00 | ||
+ | 13 0B 00 00 00 00 00 00 00 00 00 00 42 47 | ||
+ | 52 73 00 00 00 00 00 00 00 00 00 00 00 00 | ||
+ | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ||
+ | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ||
+ | 00 00 00 00 00 00 00 00 02 00 00 00 00 00 | ||
+ | 00 00 00 00 00 00 00 00 00 00</font> | ||
+ | |||
+ | <FONT color=blue>FF FF FF FF FF FF FF FF FF 00 00 00 FF FF </font> terzo blocco: ''dati pixel immagine'' | ||
+ | <FONT color=blue>FF FF FF FF FF FF FF 00 00 00 FF FF FF FF | ||
+ | FF FF FF FF FF 00 00 00</font> | ||
+ | ==Estrarre i singoli dati-byte della struttura della mappa dei pixel== | ||
+ | Avendo il file di formato "BMP", per estrarre dal file i singoli byte-dati costituenti la struttura della mappa dei pixel della bitmap, è possibile adottare il seguente codice: | ||
+ | Public Sub Main() | ||
+ | |||
+ | Dim s As String | ||
+ | Dim w, h As Integer | ||
+ | Dim bit, saltus As Short | ||
+ | |||
+ | s = File.Load("<FONT Color=darkgreen>''/percorso/del/file.bmp''</font>") | ||
+ | |||
+ | w = Int@(s[18, SizeOf(gb.Integer)]) | ||
+ | h = Int@(s[22, SizeOf(gb.Integer)]) | ||
+ | bit = Short@(s[28, SizeOf(gb.Short)]) | ||
+ | saltus = 14 + Int@(s[14, SizeOf(gb.Integer)]) | ||
+ | |||
+ | Print "Offset", "Dati" | ||
+ | For i As Integer = saltus To (w * h * (bit / 8)) | ||
+ | Print i, Hex(Byte@(s[i]), 2) <FONT Color=gray>' ''Mostra i singoli byte-dati del file bmp''</font> | ||
+ | Wait 0.3 | ||
+ | Next | ||
+ | |||
+ | End | ||
− | + | =Riferimenti= | |
+ | * https://it.wikipedia.org/wiki/Windows_bitmap#Struttura | ||
+ | * http://www.brescianet.com/appunti/vari/tracciati/bmpformat.htm |
Versione attuale delle 05:20, 19 gen 2024
Il formato BMP (Bitmap) è un formato di immagini ottenute con la tecnica della Grafica a griglia, ed i relativi file posseggono generalmente l'estensione .bmp .
Del formato BMP esistono tre versioni: la 3, la 4 e la 5.
Indice
Struttura del file BMP
Il file di formato .bmp è sostanzialmente composto da tre blocchi:
- quello iniziale (bitmapfileheader), formato da 14 byte, che contiene informazioni sul file medesimo.
- il bitmapinfoheader, formato da 40 byte, che contiene informazioni generiche sull'immagine. Con le versioni 4 e 5 tale blocco finale è stato ampliato con l'aggiunta di nuovi campi in coda.
- quello finale che contiene i dati veri e propri relativi ai colori di ciascun pixel.
Per la struttura in dettaglio rinviamo alla relativa esposizione presente in Wikipedia.
V'è da precisare che l'ordine di impostazione dei byte in un file .bmp è little-endian.
Analisi del blocco dei pixel che compongono l'immagine
Prenderemo in considerazione un file .bmp a colori con risoluzione a 24 bit (quindi il colore di ogni pixel viene definito da 3 byte. Il che significa che il pixel stesso è definito da 3 byte). Come abbiamo già visto, i dati specifici (3 byte) riguardanti il colore di ciascun pixel, costituente l'immagine, sono custoditi nel terzo blocco del file.
Ciascun gruppo di 3 byte è appartenente all'altezza (Height) dell'immagine e quindi - se vogliamo dire - contribuisce a definire una colonna di pixel.
L'insieme dei gruppi di 3 byte, che definiscono i colori dei pixel, formano la dimensione della lunghezza (Width) in pixel dell'immagine, o - se vogliamo dire - una riga.
Il numero dei dati-byte, relativi ai colori dei pixel di ciascuna riga di pixel, deve essere sempre uguale ad un numero multiplo di 4. In caso contrario si aggiungono alla riga dei byte dei colori tanti byte zero quanti ne mancano per raggiungere il numero più prossimo multiplo di 4.
Esempio pratico
Prendiamo come semplice esempio un file immagine in formato BMP composto da 3 pixel in lunghezza (tre colonne) e da 3 pixel in altezza (tre righe). Tutti i byte hanno valore FF, ad indicare che l'immagine è completamente di colore bianco. Ogni riga che compone il reticolo dell'immagine, dunque, sarà inizialmente formata da 9 byte (3 byte * 3 pixel). Ma 9 non è un multiplo di 4, e pertanto si dovranno aggiungere tanti byte zero quanti sono necessari per raggiungere il numero più vicino al 9 che sia un multiplo di 4, ossia il 12. Quindi si dovranno aggiungere per ciascuna riga di pixel ben 3 byte di valore zero.
Così la struttura di tale blocco in questo esempio sarà il seguente:
|----------9 byte--------| .........FF FF FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF 00 00 00
Questa regola vale anche nel caso di un'immagine rettangolare, poiché essa si applica soltanto all'insieme dei gruppi di 3 byte che impostano il colore dei relativi pixel e che compogono una riga, ossia la lunghezza (width) in pixel della immagine.
Esempio disposizione dei byte di un file BMP completo
Vediamo ora l'esempio del file precedentemente rappresentato, ossia di un file immagine di formato BMP a colori con risoluzione a 24 bit e di dimensioni 3 x 3 pixel tutti di colore bianco:
42 4D 9E 00 00 00 00 00 00 00 7A 00 00 00 primo blocco: bitmap file header 6C 00 00 00 03 00 00 00 03 00 00 00 01 00 secondo blocco: bitmap info header 18 00 00 00 00 00 24 00 00 00 13 0B 00 00 13 0B 00 00 00 00 00 00 00 00 00 00 42 47 52 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF 00 00 00 FF FF terzo blocco: dati pixel immagine FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF 00 00 00
Estrarre i singoli dati-byte della struttura della mappa dei pixel
Avendo il file di formato "BMP", per estrarre dal file i singoli byte-dati costituenti la struttura della mappa dei pixel della bitmap, è possibile adottare il seguente codice:
Public Sub Main() Dim s As String Dim w, h As Integer Dim bit, saltus As Short s = File.Load("/percorso/del/file.bmp") w = Int@(s[18, SizeOf(gb.Integer)]) h = Int@(s[22, SizeOf(gb.Integer)]) bit = Short@(s[28, SizeOf(gb.Short)]) saltus = 14 + Int@(s[14, SizeOf(gb.Integer)]) Print "Offset", "Dati" For i As Integer = saltus To (w * h * (bit / 8)) Print i, Hex(Byte@(s[i]), 2) ' Mostra i singoli byte-dati del file bmp Wait 0.3 Next End