PROGRAMMIAMO
File - Formato bmp
Il formato BMP

Il formato BMP è uno dei formati più semplici (sviluppato congiuntamente da Microsoft e IBM) ed è particolarmente diffuso sulle piattaforme Windows. I file BMP hanno di solito estensione .bmp e registrano l'immagine come una matrice di pixel. Ogni pixel viene poi rappresentato con un certo numero di bit, a seconda del numero di colori dell'immagine.

A differenza di altri formati più evoluti, in un file bmp le immagini possono essere memorizzate in forma non compressa (anche se il formato bmp supporta la compressione lossless Run-length encoding). In un file bmp non compresso il peso in bit dell'immagine può essere determinato moltiplicando le sue dimensioni in pixel per il numero di bit attribuiti ad ogni pixel. Per esempio un'immagine bmp 300 x 400 con 8 bit per pixel di profondità colore occuperà 120.000 Byte.

In realtà le dimensioni dei file bmp sono leggermente maggiori del peso della semplice immagine in quanto essi contengono anche alcune informazioni aggiuntive, come mostrato nella figura seguente:

La struttura nel dettaglio è spiegata qui sotto:

File Header (14 bytes) 

Quest'area contiene una struttura dati chiamata BITMAPFILEHEADER con alcune informazioni sul file.
Firma (2 bytes) Caratteri 'BM'
FileSize (4 bytes) Dimensioni del file in byte
reserved (4 bytes) Attualmente non usato (=0)
DataOffset (4 bytes) Distanza in byte (detta offset) della parte dati (Pixel Data)

Info Header (40 bytes) 

Quest'area contiene una struttura dati chiamata BITMAPINFOHEADER contenente informazioni sull'immagine
Size (4 bytes) Dimensioni di InfoHeader (40)
Width (4 bytes) Larghezza in pixel dell'immagine
Height (4 bytes) Altezza in pixel dell'immagine
Planes (2 bytes) Numero di piani (=1)
BitCount (2 bytes) Bits per Pixel
1 = monocromatica NumColors = 1
4 = 4bit
NumColors
 = 16
8 = 8bit
NumColors
 = 256
16 = 16bit
NumColors
 = 65536
24 = 24bit
NumColors
 = 16M
Compression (4 bytes) Tipo di compressione
0 = BI_RGB no compression 
1 = BI_RLE8 8bit RLE encoding 
2 = BI_RLE4 4bit RLE encoding
ImageSize (4 bytes) (compressed) Size of Image 
It is valid to set this =0 if Compression = 0
XpixelsPerM (4 bytes) Risoluzione orizzontale: Pixels/meter
YpixelsPerM (4 bytes) Risoluzione verticale: Pixels/meter
ColorsUsed (4 bytes) Numero di colori effettivamente usati
ColorsImportant (4 bytes) Numero di colori importanti
 0 = all
Colour Table (o Palette) Presente solo se BitsPerPixel <= 8 
Number of bytes = 4 * NumColors 
I 4 byte di ogni colore rappresentano: 
            Rosso (1 byte) 
            Verde (1 byte) 
            Blu (1 byte) 
            riservato/non usato (1 byte)
Pixel Data Quest'area del file contiene la mappa dei pixel dell'immagine

 

La palette

L'area Colour Table (detta anche tavolozza o palette) associa un numero (indice) ad ogni colore che può essere assegnato ad un pixel. In pratica i colori presenti nella immagine sono numerati progressivamente (con un indice che va da 0 in avanti) e a ogni valore dell'indice viene associato il codice RGB completo del colore (tre byte, uno per il rosso, uno per il verde e uno per il blu - più un quarto byte riservato).

Questo meccanismo permette di risparmiare lo spazio in byte occupato dal file immagine.

Nel caso di immagini con più di 8 bit per pixel (16, 24 o 32 bit per pixel), la palette non viene usata (il colore dei pixel non è indicizzato) e il colore viene codificato direttamente nelle sue componenti RGB.

I colori codificati nella palette non sono fissi e predeterminati, ma possono variare da un'immagine all'altra. Lo scopo della palette è appunto quella di codificare tutti (e solo) i colori che l'immagine utilizza. Per essere ancora più concreti, in una certa immagine bmp, il codice (indice) 1 potrebbe rappresentare una certa sfumatura di giallo, mentre in un'altra (dove magari tale sfumatura è assente) lo stesso numero potrebbe essere usato per rappresentare un altro colore (es. rosa).

Si consideri anche la figura seguente:

Palette immagine

La palette è stata rappresentata con una tavolozza di 8 colori numerati da 0 (bianco) a 7 (rosso). I numeri (indici) assegnati ai colori sono arbitrari. Sulla destra è rappresentato un disegno che utilizza tali 8 colori (lo sfondo è in bianco, colore numero 0).

Come si è detto, la palette consente di risparmiare spazio nell'immagine, poiché il colore di ogni singolo pixel viene rappresentato con un indice, invece che col codice RGB completo a 24bit. Per esempio con un'immagine a 16 colori, basteranno i numeri da 0 (0000) a 15 (1111) cioè solo 4 bit per ogni colore.

La mappa dei pixel

L'area Pixel Data (detta anche mappa dei pixel) costituisce il corpo vero e proprio della bitmap, dove ad ogni pixel si fa corrispondere un colore sotto forma di indice nella tavolozza (Colour Table), oppure direttamente nelle sue componenti cromatiche RGB (per le immagini bmp con più di 16 bit di profondità colore).

I pixel nella mappa dei pixel sono mappati in un ordine un po' particolare: da sinistra a destra e dal bassi verso l'alto. Questo significa che il primo valore nella Pixel Data rappresenta il pixel in basso a sinistra nell'immagine e l'ultimo valore è il pixel in alto a destra. La figura seguente mostra la mappatura dei pixel in una immagine bmp 8 x 8 (sopra è visualizzato il contenuto esadecimale del file, in rosso la mappa dei pixel; nella parte sottostante si trova l'immagine corrispondente).

Mappa dei pixel bmp

 

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it