Windows Bitmap è un formato dati utilizzato per la rappresentazione di immagini raster introdotto da Microsoft con Windows 3.0 nel 1990. Sono state sviluppate tre versioni del formato bitmap. La prima e più comunemente utilizzata è la
versione 3 (non esistono versioni antecedenti); le versioni successive 4 e 5 si incontrano piuttosto raramente.
Versione 3Permette operazioni di lettura e scrittura molto veloci e senza perdita di qualità, ma richiede generalmente una maggior quantità di memoria rispetto ad altri formati analoghi.
Le immagini bitmap possono avere una profondità di 1, 4, 8, 16, 24 o 32 bit per pixel.
Le bitmap con 1, 4 e 8 bit contengono una tavolozza per la conversione dei possibili indici numerici (rispettivamente 2, 16 e 256) nei rispettivi colori.
Nelle immagini con profondità più alta il colore non è indicizzato bensì codificato direttamente nelle sue componenti cromatiche RGB; con 16 o 32 bit per pixel alcuni bit possono rimanere inutilizzati.
Questa versione non supporta il canale alpha, la correzione del colore né i metadati.
Versioni 4 e 5Microsoft ha introdotto le nuove versioni 4 e 5 del formato bitmap, con Windows 95 e Windows 98, che supportano il canale alpha e la definizione di spazi di colori personalizzati.
La versione 5 prevede inoltre la possibilità di utilizzare un profilo di colore in un file esterno e d' incorporare immagini JPEG e PNG. Questi nuovi formati si trovano tuttavia assai raramente.
StrutturaLe immagini bitmap sono codificate utilizzando semplici strutture che ne descrivono le proprietà. Tutti i valori sono in ordine little endian (memorizzazione che inizia dal byte meno significativo per finire col più significativo).
BITMAPFILEHEADERQuesto è l' header della bitmap che contiene informazioni sulla grandezza in byte del file e l' offset dall' inizio del file del primo byte nella mappa dei pixel. Questa struttura è assente quando la bitmap è integrata come risorsa all' interno di un' applicazione o libreria.
BITMAPINFOHEADERQui sono indicate le dimensioni in pixel dell' immagine e il numero di colori utilizzati. Le informazioni sono relative al dispositivo sul quale la bitmap è stata creata. Sempre in questa struttura sono indicate inoltre la risoluzione orizzontale e verticale del dispositivo di output: questi valori, uniti a quelli della larghezza e dell' altezza in pixel, determinano le dimensioni di stampa dell' immagine in grandezza reale.
MAPPA DEI PIXELQuesta struttura di dati costituisce il corpo vero e proprio della bitmap, dove ad ogni pixel si fa corrispondere un colore sotto forma di indice nella tavolozza, oppure nelle sue componenti cromatiche RGB (memorizzate nell' ordine BGR).
Struttura dettagliata (tabelle prese da Wikipedia per comodità)


Esempio
(immagine bitmap 3 pixel di larghezza e 2 pixel di altezza, ingrandita per l' esempio, di dimensione 78 byte su disco)
I colori sono:- blu scuro (componenti RGB decimale: rosso 18, verde 52, blu 86 / esadecimale: rosso 12, verde 34, blu 56)
- blu chiaro (componenti RGB decimale: rosso 120, verde 154, blu 188 / esadecimale: rosso 78, verde 9A, blu BC)
(componenti RGB: ogni colore, a livello informatico, è considerato come l' unione delle 3 componenti rossa, verde e blu ... i valori vanno da 0 a 255)
File bitmap d' esempio visto in esadecimale:
Come si vede, la colonna centrale è la rappresentazione esadecimale dell' immagine a scacchiera di sopra. Ogni riga sono 10 byte raggruppati a 2 a 2. La colonna di sinistra indica il numero di byte corrispondente alla riga (quindi di 10 in 10 come è ovvio) mentre quella di destra è la visualizzazione in caratteri ASCII.
La parte rossa è
BITMAPFILEHEADER di 14 byte e come si vede comincia con i 2 byte
42 e
4D (posizioni 0 e 1) che corrisponde ai caratteri ASCII
BM; il 3° byte
4E (posizione 2) indica la dimensione del file di
78 byte; l' 11° byte, in posizione 10,
36 indica in decimale
54 ovvero la posizione in cui comincia la mappa dei pixel (al 55° byte appunto).
La parte verde è
BITMAPINFOHEADER di 40 byte che comincia col byte
28 che indica la versione 3 del formato bitmap; dopo 4 byte si trova la larghezza
03 che indica appunto la larghezza in pixel, altri 4 byte dopo si trova l' altezza
02 che indica l' altezza in pixel (se il numero è positivo allora si considera la mappa dei pixel partendo dal pixel in basso a sinistra procedendo fino al pixel in alto a destra); alla posizione 26 si trova la costante
01; alla posizione 28 si trova il valore esadecimale
18 che indica in decimale la profondità del colore, ovvero 24 bit. Alla posizione 30 c'è il valore
00 che indica il livello di compressione (nessuna compressione); alla posizione 34 c'è il valore
18 che indica di quanti byte è composta la mappa dei pixel (riquadro blu), ovvero 24 byte. Alle posizioni 38-39 e 42-43 vi sono i valori (non interessanti) che indicano
le dimensioni di stampa (pixel per metro) in larghezza ed in altezza (valori
C3 e
0E). I successivi valori fino alla fine del riquadro, indicano la tavolozza di colori usata, in questo caso
0 vuol dire che non viene usata nessuna tavolozza.
La parte blu è la
MAPPA DEI PIXEL di 24 byte, come indicato nella sezione BitmapInfoHeader precedente. I valori delle componenti RGB di ciascun colore di ciascun pixel vengono memorizzati in formato BGR, ovvero blu-verde-rosso, all' incontrario rispetto alla teoria RGB.
La mappa dei pixel corrisponde alla lista delle componenti BGR di ciascun pixel in ordine:
pixel 4, pixel 5, pixel 6 ... 3 byte di 0 ... pixel 1, pixel 2, pixel 3 ... 3 byte di 0
Per ciascun pixel le componenti sono in ordine BGR, come ribadito prima.
Si parte infatti col pixel 4 (blu chiaro): ... BC ... 9A ... 78 ...
Poi col pixel 5 (blu scuro): ... 56 ... 34 ... 12 ...
E si continua così ...
alla fine di ogni riga si aggiungono 3 byte di 0.