Windows bitmap

Da Wikipedia, l'enciclopedia libera.
Windows bitmap (BMP) / Device-independent bitmap (DIB)
Sviluppato da Microsoft
Licenza Libero da brevetti
Tipo immagini raster senza compressione / RLE
Compressione Lossless
Sito web www.microsoft.com

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

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

Caratteristiche[modifica | modifica sorgente]

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[modifica | modifica sorgente]

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[modifica | modifica sorgente]

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 file 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[1].

Struttura[modifica | modifica sorgente]

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 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.
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. 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.

54+4\left(u\left(15-b\right)\cdot2^{b}+h\left\lceil\frac{w\cdot b}{32}\right\rceil\right)

Con u\left(x\right) si è indicata la funzione gradino di Heaviside, il cui valore è 0 per argomenti negativi e 1 per quelli positivi. \lceil x\rceil 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))

Vantaggi e svantaggi[modifica | modifica sorgente]

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, molto maggiore se paragonata a quella di altri tipi di file, 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
Smiley head happy.png
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.

Anche con l'inconveniente delle maggiori dimensioni dei file ed anche senza il supporto per la trasparenza ci sono altri 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[modifica | modifica sorgente]

Seppure sotto molti aspetti antiquato e superato, il formato d'immagine bitmap detiene per ragioni storiche e di retrocompatibilità un primato sui sistemi Windows. È per questa circostanza, legata alla popolarità di Windows per i personal computer, che le bitmap continuano ad essere tutt'oggi utilizzate e diffuse, benché siano disponibili per quasi tutte le esigenze alternative migliori.

Elaborazione delle immagini[modifica | modifica sorgente]

Veloci e ingombranti, le bitmap si rivelano adatte soprattutto alla memorizzazione temporanea delle immagini che vengono modificate spesso. Molti software di scansione per Windows salvano le immagini digitalizzate per default come file bitmap.

Internet[modifica | modifica sorgente]

Il formato bitmap appare poco adeguato ad Internet per diverse ragioni:

  • Le immagini bitmap sono più grandi in termini di memoria rispetto alle loro equivalenti in altri formati, perciò richiedono più tempo per la trasmissione.
  • Sui sistemi operativi diversi da Windows, molti browser e client di posta elettronica non sono in grado di visualizzare le immagini in questo formato.
  • Il formato bitmap, almeno nella comune versione 3, non supporta alcun tipo di trasparenza, ponendo limiti alle possibilità del web design.

Bitmap nella programmazione.[modifica | modifica sorgente]

Sui sistemi operativi Windows le bitmap sono, prima ancora che file, oggetti utilizzati internamente dall'interfaccia grafica GDI. Diversi linguaggi di programmazione per Windows hanno perciò sviluppato astrazioni specifiche per questo tipo di dati.

Windows API[modifica | modifica sorgente]

L'API di Windows offre sin dalle prime versioni funzioni speciali che permettono di effettuare le più semplici operazioni sulle bitmap, come copiare o combinare parti di un'immagine in memoria. Le bitmap sono oggetti GDI così come i font (tipi di carattere), i brush (pennelli) e le palette (tavolozze); così come gli altri oggetti di Windows le bitmap vengono manipolate attraverso un handle, cioè un valore che identifica l'oggetto nell'ambiente di esecuzione. Dopo essere state create chiamando le apposite funzioni, le bitmap vengono selezionate in un device context, un'entità astratta che serve a comunicare con una periferica o dispositivo virtuale. In questo modo si possono inviare informazioni ad un monitor o ad una stampante. Selezionando una bitmap in un device context in memoria è possibile inoltre chiamare le apposite funzioni GDI per effettuare le più comuni modifiche all'immagine. Per operazioni grafiche più complesse si può accedere direttamente alla mappa dei pixel.

I linguaggi di programmazione ad alto livello utilizzano in parte le funzioni API per implementare tecniche di programmazione grafica con le bitmap.

.NET[modifica | modifica sorgente]

Il .NET Framework offre supporto nativo per diversi tipi d'immagini raster, e naturalmente anche per le bitmap tramite la classe System.Drawing.Image.Bitmap. L'ambiente di sviluppo di Visual Studio .NET consente di inserire una bitmap sullo sfondo di un form o componente semplicemente selezionandone il percorso in una lista di proprietà. Questa tecnica, che risale alle primissime incarnazioni di Visual Studio, funzionava all'inizio solo con le bitmap ed è stata poi estesa ad altri tipi d'immagine.

Java[modifica | modifica sorgente]

A differenza del .NET Framework che è stato sviluppato dalla Microsoft soprattutto per Windows, Java si propone di essere un sistema multipiattaforma, per assicurare che lo stesso programma funzioni allo stesso modo su tutte le piattaforme dei diversi produttori. Non sorprende perciò che non ci sia in Java, come c'è in .NET, una classe specifica per manipolare il formato Windows bitmap. Esisteno però e sono reperibili in Internet alcune librerie e moduli di programmazione aggiuntivi che implementano queste funzionalità.

C / C++[modifica | modifica sorgente]

Tra le librerie C C++ degne di nota per la manipolazione di immagini, possiamo trovare FreeImage, libreria Open source multipiattaforma, che supporta un grosso numero di formati e funzioni.

Delphi[modifica | modifica sorgente]

Sin dalla prima edizione di Delphi, è presente nella VCL (Visual Component Library) l'oggetto TBitmap, che permette di manipolare files bitmap. Esistono poi progetti esterni a Delphi, che ampliano le potenzialità e le funzionalità dell'oggetto TBitmap, tra questi ricordiamo Graphics32, Project JEDI e GLScene.

Python[modifica | modifica sorgente]

Anche tramite il linguaggio Python è possibile manipolare immagini: tra le librerie disponibili, troviamo PIL e FreeImagePy, basata su FreeImage


from CoreGraphics import *
import math
 
# Crea un contesto bitmap RGB, trasperente con sfondo nero 256x256
cs = CGColorSpaceCreateDeviceRGB ()
c = CGBitmapContextCreateWithColor (256, 256, cs, (0,0,0,0))
 
# Crea un quadrato giallo con una linea rossa che ne percorre il perimetro
c.saveGState ()
c.setRGBStrokeColor (1,0,0,1)			# rosso
c.setRGBFillColor (1,1,0,1)			# giallo
c.setLineWidth (3)
c.setLineJoin (kCGLineJoinBevel)
c.addRect (CGRectMake (32.5, 32.5, 191, 191))
c.drawPath (kCGPathFillStroke);
c.restoreGState ()
 
# Aggiunge del testo ruotato
 
c.saveGState ()
c.translateCTM (128, 128)
c.rotateCTM (math.radians(-30.0))
c.translateCTM (-128, -128)
c.setRGBStrokeColor (0,0,0,1)
c.setRGBFillColor (1,1,1,1)
c.selectFont ("Helvetica", 36, kCGEncodingMacRoman)
c.setTextPosition (40, 118)
c.setTextDrawingMode (kCGTextFillStroke)
c.setShadow (CGSizeMake (0,-10), 2)
c.showText ("hello, world", 12)
c.restoreGState ()
 
# Salva l' immagine in formato .png
 
c.writeToFile ("out.png", kCGImageFormatPNG)

Note[modifica | modifica sorgente]

  1. ^ Creating Textures

Bibliografia[modifica | modifica sorgente]

  • Compressed Image File Formats - John Miano, Addison-Wesley Professional, 1999 - ISBN 0-201-60443-4

Voci correlate[modifica | modifica sorgente]

Collegamenti esterni[modifica | modifica sorgente]