Differenze tra le versioni di "Struttura del formato BMP"

Da Gambas-it.org - Wikipedia.
 
(5 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==
Riga 17: Riga 15:
 
===Analisi del blocco dei pixel che compongono l'immagine===
 
===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.
 
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 definisce l'altezza (''Height'') dell'immagine, o - se vogliamo dire - 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.
+
<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>Il numero dei dati 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.
+
<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====
 
====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 <SPAN style="text-decoration:underline">ciascuna riga di pixel</span> ben 3 byte di valore zero.
+
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:
 
<BR>Così la struttura di tale blocco in questo esempio sarà il seguente:
 
           |----------9 byte--------|
 
           |----------9 byte--------|
Riga 29: Riga 28:
  
  
===Esempio della composizione di un file completo===
+
===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:
 
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=red>42 4D 9E 00 00 00 00 00 00 00 7A 00 00 00 </font> primo blocco: ''bitmap file header''
 
   
 
   
  <FONT color=006400>00 03 00 00 00 03 00 00 00 01 00 18 00 00 </font> secondo blocco: ''bitmap info 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>00 00 00 24 00 00 00 13 0B 00 00 13 0B 00
+
  <FONT color=006400>18 00 00 00 00 00 24 00 00 00 13 0B 00 00
00 00 00 00 00 00 00 00 00 42 47 52 73 00
+
13 0B 00 00 00 00 00 00 00 00 00 00 42 47
00 00 00 00 00 00 00 00 00 00 00 00 00 00
+
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 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 00 02 00 00 00 00 00
  00 00 00 00 00 00 00</font>
+
  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 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
 
  <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>
 
  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.

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