Struttura del formato BMP

Da Gambas-it.org - Wikipedia.

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.

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


Riferimenti