Windows bitmap è un formato dati utilizzato per la rappresentazione di immagini raster sui sistemi operativi Microsoft Windows. Noto soprattutto come formato di file, fu introdotto con Windows 3.0 nel 1990.

Le bitmap, come sono comunemente chiamati i d'immagine di questo tipo, hanno generalmente l'estensione .bmp, o meno frequentemente .dib (device-independent bitmap).

Caratteristiche 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 3 Il formato di file Windows bitmap nella versione 3 permette 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 (rispettivamente 2, 16 e 256) possibili indici numerici 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.

La versione 3 del formato non supporta il canale alfa, la correzione del colore né i metadati.

Versioni 4 e 5 Con Windows 95 e Windows 98 Microsoft ha introdotto le nuove versioni 4 e 5 del formato bitmap, che supportano il canale alfa e la definizione di spazi di colori personalizzati. La versione 5 prevede inoltre la possibilità di utilizzare un profilo di colore in un esterno e d'incorporare immagini JPEG e PNG. Questi nuovi formati si trovano tuttavia assai raramente come file indipendenti e molte applicazioni non sono in grado di riconoscerli; il loro uso principale è quello di formato interno per i programmi di Windows o di videogiochi.

Struttura Header del file(BITMAPFILEHEADER) Blocco d'informazioni(BITMAPINFO):

Header della bitmap(BITMAPINFOHEADER)

eventualmente: modello di colore

eventualmente: tavolozza eventualmente: spazio inutilizzato mappa dei pixel eventualmente: spazio inutilizzato Struttura di una bitmap

Su disco le immagini bitmap sono codificate utilizzando alcune semplici strutture che ne descrivono le proprietà. Tutti i valori sono in ordine little endian. BITMAPFILEHEADER Questo è l'header della bitmap che contiene informazioni sulla grandezza in byte del 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. BITMAPINFOHEADER Qui 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. Modello di colore Con le versioni 4 e 5 del formato bitmap il blocco d'informazioni è stato ampliato con strutture che consentono di definire modelli di colore personalizzati. Nella pratica queste strutture sono poco comuni. Tavolozza Questa struttura è un array che fa corrispondere un colore ad ogni indice che può essere assegnato ad un pixel. Nella tavolozza ogni colore è rappresentato da una struttura di 4 byte (RGBQUAD), uno ciascuno per i componenti rosso, verde e blu più un byte non utilizzato. Nel caso di immagini con 16, 24 o 32 bit per pixel questa tabella di colori non è necessaria perché il colore dei pixel non è indicizzato, bensì codificato direttamente nelle sue componenti. Mappa dei pixel Questa 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. Per immagini a 4 o 8 bit per pixel la mappa potrebbe essere compressa secondo l'algoritmo RLE (run-length encoding). Nel caso in cui la dimensione in bytes delle linee orizzontali non sia un multiplo di 4, queste vengono allungate con bytes nulli. Nella versione 5 del formato bitmap questa struttura può anche incorporare immagini JPEG e PNG.

Nel caso più comune di bitmap nella versione 3 del formato non compresse e senza tavolozza extra per profondità superiori ad 8 bit per pixel, la dimensione in byte richiesta dal file può essere espressa con la seguente formula matematica, dove w ed h indicano rispettivamente la larghezza e l'altezza dell'immagine in pixel e b la profondità in bit per pixel.

Con si è indicata la funzione gradino di Heaviside, il cui valore è 0 per argomenti negativi e 1 per quelli positivi. indica la funzione soffitto, equivalente al numero intero più piccolo maggiore o uguale all'argomento.

La stessa espressione si può formulare più semplicemente in linguaggio C in questo modo: 54 + 4 * (((1 << b) & 0xffff) + h * ((w * b + 31) / 32))

Struttura dettagliata BITMAPFILEHEADER (dimensione: 14 byte) Offset Tipo Nome Contenuto 0 Word bfType La stringa ASCII "BM" (valore decimale 16973, esadecimale 424D) 2 Dword bfSize Dimensione del file () 6 Dword bfReserved Sempre 0 10 Dword bfOffBits Offset del primo byte della mappa dei pixel a partire dall'inizio del file

BITMAPINFOHEADER (dimensione: 40 byte) Offset Tipo Nome Contenuto 0 Dword biSize Dimensione in byte del blocco d'informazioni insieme alle strutture per il modello di colore aggiunte nelle versioni 4 e 5: Versione 3 40 (hex 28)) Versione 4 108 (hex 6C) Versione 5 124 (hex 7C) 4 LONG biWidth Larghezza dell'immagine in pixel 8 LONG biHeight Corrisponde in valore assoluto all'altezza dell'immagine in pixel: quando il valore è positivo l'immagine è bottom-up (la mappa dei pixel incomincia dalla riga di pixel più in basso e finisce con quella più in alto). Questa è la variante più comune. quando il valore è negativo l'immagine è top-down (la mappa dei pixel incomincia dalla riga di pixel più in alto e finisce con quella più in basso). 12 Word biPlanes Sempre 1 14 Word biBitCount Profondità di colore dell'immagine in bit per pixel, dev'essere uno dei seguenti valori: 1, 4, 8, 16, 24 o 32. In caso di 1, 4 o 8 bit per pixel i colori sono indicizzati. I valori 16 e 32 sono poco comuni. Nella versione 5 del formato si può usare il valore 0 quando viene incapsulata un'immagine JPEG o PNG. 16 Dword biCompression Uno dei seguenti valori: 0 (BI_RGB) La mappa dei pixel non è compressa. 1 (BI_RLE8) La mappa dei pixel è compressa con l'algoritmo RLE per 8 bit per pixel. Valido solo per biBitCount = 8 e biHeight > 0. 2 (BI_RLE4) La mappa dei pixel è compressa con l'algoritmo RLE per 4 bit per pixel. Valido solo per biBitCount = 4 e biHeight > 0. 3 (BI_BITFIELDS) La mappa dei pixel non è compressa ed è codificata secondo maschere di colore personalizzate. Valido solo per biBitCount = 16 o 32; poco comune. Nella versione 5 del formato sono ammessi inoltre i seguenti valori: 4 (BI_JPEG) La bitmap incapsula un'immagine in formato JPEG. 5 (BI_PNG) La bitmap incapsula un'immagine in formato PNG. 20 Dword biSizeImageIndica la dimensione in byte del buffer mappa dei pixel. Questo valore può essere lasciato a zero quando biCompression è impostato a BI_RGB. 24 LONG biXPelsPerMeter Risoluzione orizzontale del dispositivo di output in pixel per metro; 0 se la risoluzione non è specificata. 28 LONG biYPelsPerMeter Risoluzione verticale del dispositivo di output in pixel per metro; 0 se la risoluzione non è specificata. 32 Dword biClrUsed Quando biBitCount = 1 0 Quando biBitCount = 4 o 8 Numero di corrispondenze effettivamente utilizzate nella tavolozza dei colori; 0 indica il numero massimo (16 o 256). Altrimenti Numero di corrispondenze nella tavolozza dei colori (0 = nessuna tavolozza). Per profondità maggiori di 8 bit per pixel la tavolozza non è normalmente necessaria, ma quando c'è può essere usata dal sistema o da alcuni programmi per ottimizzare la rappresentazione dell'immagine. 36 Dword biClrImportant Quando biBitCount = 1, 4 o 8 Numero di colori utilizzati nell'immagine; 0 indica tutti i colori della tavolozza. Altrimenti Se la tavolozza esiste e contiene tutti i colori utilizzati nell'immagine Numero di colori Altrimenti 0

Con le versioni 4 e 5 del formato, Microsoft ha ampliato il blocco d'informazioni aggiungendo nuovi campi in coda alla struttura della versione precedente. La documentazione sul formato di queste nuove versioni è disponibile sulla MSDN Library.

BITMAPINFOHEADER BITMAPV4HEADER BITMAPV5HEADER byte biSize bV4Size bV5Size 4 biWidth bV4Width bV5Width 4 biHeight bV4Height bV5Height 4 biPlanes bV4Planes bV5Planes 2 biBitCount bV4BitCount bV5BitCount 2 biCompression bV4V4Compression bV5Compression 4 biSizeImage bV4SizeImage bV5SizeImage 4 biXPelsPerMeter bV4XPelsPerMeter bV5XPelsPerMeter 4 biYPelsPerMeter bV4YPelsPerMeter bV5YPelsPerMeter 4 biClrUsed bV4ClrUsed bV5ClrUsed 4 biClrImportant bV4ClrImportant bV5ClrImportant 4 bV4RedMask bV5RedMask 4 bV4GreenMask bV5GreenMask 4 bV4BlueMask bV5BlueMask 4 bV4AlphaMask bV5AlphaMask 4 bV4CSType bV5CSType 4 bV4Endpoints bV5Endpoints 36 bV4GammaRed bV5GammaRed 4 bV4GammaGreen bV5GammaGreen 4 bV4GammaBlue bV5GammaBlue 4 bV5Intent 4 bV5ProfileData 4 bV5ProfileSize 4 bV5Reserved 4

Vantaggi e svantaggi Una delle caratteristiche essenziali del formato bitmap che ne hanno fatto per molto tempo la fortuna è la velocità con cui le immagini vengono lette o scritte su disco, maggiore se paragonata a quella di altri tipi di , soprattutto sulle macchine più lente. Nelle bitmap non compresse la rappresentazione dei dati nella memoria RAM è in gran parte simile, spesso identica, a quella dei dati su disco: il processore non è costretto ad effettuare calcoli laboriosi durante le operazioni di codifica e di decodifica e il tempo di accesso ai dati è spesso limitato solo dall'hardware del drive.

Dimensioni in byte della stessa immagine (128 colori) in diversi formati raster BMP non compresso   24030 BMP compresso   8764 GIF   5365 PNG   4029 Esiste anche, ma non è molto usata, la possibilità di comprimere le bitmap da 16 e 256 colori con l'algoritmo RLE. La compressione RLE non è tuttavia efficiente come altri metodi di compressione lossless. Le bitmap, anche quelle compresse, occupano di regola più spazio su disco rispetto ad altri formati raster come GIF o PNG, e sono perciò meno adatte di questi alla trasmissione di immagini via Internet o alla memorizzazione permanente su CD, DVD o altri supporti di dati.

Una limitazione grave del formato bitmap, almeno nella comune versione 3, è quella di non supportare alcun tipo di trasparenza. Per ovviare a questo problema sono stati messi a punto diversi stratagemmi, come utilizzare un colore speciale per i pixel trasparenti, oppure servirsi di altre bitmap per mascherare le parti invisibili di un'immagine (alcune di queste tecniche sono rintracciabili nella stessa API di Windows), ma nessuno offre la stessa versatilità del canale alfa, la cui diffusione è legata soprattutto all'avvento del formato PNG.

Nonostante le maggiori dimensioni dei file e il mancato supporto per la trasparenza, ci sono diversi fattori che hanno contribuito in modo significativo alla popolarità delle bitmap: il formato è semplice, ben documentato e non è tutelato da brevetti che ne restringano il libero uso. Soprattutto quest'ultimo punto ha fatto sì che il formato bitmap sia oggi supportato da quasi tutte le applicazioni grafiche, inclusi molti programmi open source anche oltre i confini del mondo Microsoft.

Usi pratici