Windows bitmap: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Ft1 (discussione | contributi) |
Ft1 (discussione | contributi) Nessun oggetto della modifica |
||
Riga 1:
{{Compressione |
compressione = Windows bitmap (BMP) / Device-independent bitmap (DIB) |
Line 12 ⟶ 11:
== 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
=== 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 (informatica)|memoria]] rispetto ad altri formati analoghi.
Le immagini bitmap possono avere una profondità di 1, 4, 8, 16, 24 o 32 [[Bit (informatica)|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
La versione 3 del formato non supporta il [[canale alpha]], la correzione del colore né i [[Metadato|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 alpha]] e la definizione di [[Spazio dei colori|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 [[Joint Photographic Experts Group|JPEG]] e [[Portable Network Graphics|PNG]]. Questi nuovi formati si trovano tuttavia assai raramente come file indipendenti e molte [[Applicazione|applicazioni]] non sono in grado di riconoscerli; il loro uso principale è quello di formato interno per i [[Programma (informatica)|programmi]] di [[Microsoft Windows|Windows]].
== Struttura ==
Line 53 ⟶ 52:
Su disco le immagini bitmap sono codificate utilizzando alcune semplici [[Struttura dati|strutture]] che ne descrivono le proprietà. Tutti i valori sono in ordine [[Ordine dei byte|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 software|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 [[Modello di colore|modelli di colore]] personalizzati. Nella pratica queste strutture sono poco comuni.
; tavolozza
: Questa struttura è un [[array]] che fa corrispondere un colore ad ogni indice
; mappa dei pixel : Questa
<div class="NavFrame" style="clear:both; text-align:left;">
Line 94 ⟶ 93:
| style="font-family:monospace" | [[Dword|DWORD]]
| bfOffBits
| offset del primo byte della mappa dei [[pixel]] a partire dall'inizio del file
|}
Line 116 ⟶ 115:
| style="font-family:monospace" | [[Long integer|LONG]]
| biWidth
| larghezza dell'immagine in [[pixel]]
|-
| 8
| style="font-family:monospace" | [[Long integer|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
Line 133 ⟶ 132:
| style="font-family:monospace" | [[Word|WORD]]
| biBitCount
| profondità della bitmap in [[Bit (informatica)|bit]] per [[pixel]], dev'essere uno dei seguenti valori: 1, 4, 8, 16, 24 o 32. In caso di 1, 4 o 8 [[Bit (informatica)|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 [[Joint Photographic Experts Group|JPEG]] o [[Portable Network Graphics|PNG]].
|-
| 16
Line 139 ⟶ 138:
| biCompression
| uno dei seguenti valori:
; 0 (<span style="font-family:monospace">BI_RGB</span>) : La mappa dei [[pixel
; 1 (<span style="font-family:monospace">BI_RLE8</span>) : La mappa dei [[pixel]] è compressa con l'algoritmo [[RLE]] per 8 [[Bit (informatica)|bit]] per pixel. Valido solo per biBitCount = 8 e biHeight > 0.
; 2 (<span style="font-family:monospace">BI_RLE4</span>) : La mappa dei [[pixel]] è compressa con l'algoritmo [[RLE]] per 4 [[Bit (informatica)|bit]] per pixel. Valido solo per biBitCount = 4 e biHeight > 0.
; 3 (<span style="font-family:monospace">BI_BITFIELDS</span>) : 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 (<span style="font-family:monospace">BI_JPEG</span>) : La bitmap incapsula un'immagine in formato [[Joint Photographic Experts Group|JPEG]].
Line 151 ⟶ 150:
| biSizeImage
|
Indica la dimesione in byte del buffer mappa dei [[pixel]]. Questo valore può essere lasciato a zero quando biCompression è impostato a <span style="font-family:monospace">BI_RGB</span>.
|-
| 24
| style="font-family:monospace" | [[Long integer|LONG]]
| biXPelsPerMeter
| [[risoluzione]] orizzontale del dispositivo di output in [[pixel]] per [[metro]]; 0 se la risoluzione non è specificata.
|-
| 28
| style="font-family:monospace" | [[Long integer|LONG]]
| biYPelsPerMeter
| [[risoluzione]] verticale del dispositivo di output in [[pixel]] per [[metro]]; 0 se la risoluzione non è specificata.
|-
| 32
Line 169 ⟶ 168:
; 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 (informatica)|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
Line 181 ⟶ 180:
|}
<div style="margin: 1em 1.5em">''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.''</div>
<div align="center">
{|
! style="border: thin solid grey" | <span style="font-family:monospace">BITMAPINFOHEADER</span>
! style="border: thin solid grey" | <span style="font-family:monospace">BITMAPV4HEADER</span>
! style="border: thin solid grey" | <span style="font-family:monospace">BITMAPV5HEADER</span>
| ''byte''
|- bgcolor="#eeffee"
| style="border: thin solid grey" | biSize
| style="border: thin solid grey" | bV4Size
| style="border: thin solid grey" | bV5Size
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|- bgcolor="#eeffee"
| style="border: thin solid grey" | biWidth
| style="border: thin solid grey" | bV4Width
| style="border: thin solid grey" | bV5Width
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|- bgcolor="#eeffee"
| style="border: thin solid grey" | biHeight
| style="border: thin solid grey" | bV4Height
| style="border: thin solid grey" | bV5Height
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|- bgcolor="#eeffee"
| style="border: thin solid grey" | biPlanes
| style="border: thin solid grey" | bV4Planes
| style="border: thin solid grey" | bV5Planes
| align="right" bgcolor="white" style="border: thin solid grey" | 2
|- bgcolor="#eeffee"
| style="border: thin solid grey" | biBitCount
| style="border: thin solid grey" | bV4BitCount
| style="border: thin solid grey" | bV5BitCount
| align="right" bgcolor="white" style="border: thin solid grey" | 2
|- bgcolor="#eeffee"
| style="border: thin solid grey" | biCompression
| style="border: thin solid grey" | bV4V4Compression
| style="border: thin solid grey" | bV5Compression
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|- bgcolor="#eeffee"
| style="border: thin solid grey" | biSizeImage
| style="border: thin solid grey" | bV4SizeImage
| style="border: thin solid grey" | bV5SizeImage
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|- bgcolor="#eeffee"
| style="border: thin solid grey" | biXPelsPerMeter
| style="border: thin solid grey" | bV4XPelsPerMeter
| style="border: thin solid grey" | bV5XPelsPerMeter
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|- bgcolor="#eeffee"
| style="border: thin solid grey" | biYPelsPerMeter
| style="border: thin solid grey" | bV4YPelsPerMeter
| style="border: thin solid grey" | bV5YPelsPerMeter
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|- bgcolor="#eeffee"
| style="border: thin solid grey" | biClrUsed
| style="border: thin solid grey" | bV4ClrUsed
| style="border: thin solid grey" | bV5ClrUsed
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|- bgcolor="#eeffee"
| style="border: thin solid grey" | biClrImportant
| style="border: thin solid grey" | bV4ClrImportant
| style="border: thin solid grey" | bV5ClrImportant
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|-
| rowspan="13" |
| bgcolor="#ffffee" style="border: thin solid grey" | bV4RedMask
| bgcolor="#ffffee" style="border: thin solid grey" | bV5RedMask
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|- bgcolor="#ffffee"
| style="border: thin solid grey" | bV4GreenMask
| style="border: thin solid grey" | bV5GreenMask
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|- bgcolor="#ffffee"
| style="border: thin solid grey" | bV4BlueMask
| style="border: thin solid grey" | bV5BlueMask
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|- bgcolor="#ffffee"
| style="border: thin solid grey" | bV4AlphaMask
| style="border: thin solid grey" | bV5AlphaMask
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|- bgcolor="#ffffee"
| style="border: thin solid grey" | bV4CSType
| style="border: thin solid grey" | bV5CSType
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|- bgcolor="#ffffee"
| style="border: thin solid grey" | bV4Endpoints
| style="border: thin solid grey" | bV5Endpoints
| align="right" bgcolor="white" style="border: thin solid grey" | 36
|- bgcolor="#ffffee"
| style="border: thin solid grey" | bV4GammaRed
| style="border: thin solid grey" | bV5GammaRed
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|- bgcolor="#ffffee"
| style="border: thin solid grey" | bV4GammaGreen
| style="border: thin solid grey" | bV5GammaGreen
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|- bgcolor="#ffffee"
| style="border: thin solid grey" | bV4GammaBlue
| style="border: thin solid grey" | bV5GammaBlue
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|-
| rowspan="4" |
| bgcolor="#fff7ee" style="border: thin solid grey" | bV5Intent
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|-
| bgcolor="#fff7ee" style="border: thin solid grey" | bV5ProfileData
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|-
| bgcolor="#fff7ee" style="border: thin solid grey" | bV5ProfileSize
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|-
| bgcolor="#fff7ee" style="border: thin solid grey" | bV5Reserved
| align="right" bgcolor="white" style="border: thin solid grey" | 4
|}
</div>
Line 276 ⟶ 300:
</div>
Nel caso più comune di bitmap nella versione 3 del formato non compresse e senza tavolozza extra per profondità superiori ad 8 [[Bit (informatica)|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.
:<math>54+4\left(H\left(15-b\right)\cdot2^{b}+h\left\lceil\frac{w\cdot b}{32}\right\rceil\right)</math>
Line 282 ⟶ 306:
Con <math>H\left(x\right)</math> si è indicata la funzione a gradino di Heaviside, il cui valore è 0 per argomenti negativi e 1 per quelli positivi. <math>\lceil x\rceil</math> indica la funzione soffitto, equivalente al [[numero intero]] più piccolo maggiore o uguale all'argomento.
La stessa [[Espressione (matematica)|espressione]] si può formulare più semplicemente in [[C (linguaggio)|linguaggio C]] in questo modo:
<pre>
54 + 4 * (((1 << b) & 0xffff) + h * ((w * b + 31) / 32))
Line 288 ⟶ 312:
== 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, 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:
{| border="1" cellpadding="3" cellspacing="0" style="float: left; margin: 0 1em 0 0"
Line 313 ⟶ 337:
|}
|}
Esiste anche, ma non è molto usata, la possibilità di comprimere le bitmap da 16 e 256 colori con l'[[algoritmo]] [[RLE]]. La [[Compressione dei dati|compressione]] RLE non è tuttavia efficiente come altri metodi di [[Compressione dati lossless|compressione lossless]]. Le bitmap, anche quelle compresse, occupano di regola più spazio su disco rispetto ad altri formati [[raster]] come [[Graphics Interchange Format|GIF]] o [[Portable Network Graphics|PNG]], e sono perciò meno adatte di questi alla trasmissione di immagini via [[Internet]] o alla memorizzazione permanente su [[Compact disc|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 [[Windows API|API di Windows]]), ma nessuno offre la stessa versatilità del [[canale alpha]], 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 [[Brevetto|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 [[Applicazione|applicazioni]]
== Usi pratici ==
Seppure sotto molti aspetti antiquato e superato, il formato d'immagine bitmap detiene per ragioni storiche e di
▲Seppure sotto molti aspetti antiquato e superato, il formato d'immagine bitmap detiene per ragioni storiche e di compatibilità 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 ===
Line 327 ⟶ 350:
=== Internet ===
Il formato bitmap appare poco adeguato ad [[Internet]] per diverse ragioni:
* Le immagini bitmap sono più grandi in termini di [[Memoria (informatica)|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|client di posta elettronica]] non sono in grado di
* Il formato bitmap, almeno nella comune versione 3, non supporta alcun tipo di trasparenza, ponendo limiti alle possibilità del [[web design]].
== Bitmap nella programmazione ==
Sui [[Sistema operativo|sistemi operativi]] [[Microsoft Windows|Windows]] le bitmap sono, prima ancora che [[file]], [[Oggetto (informatica)|oggetti]] utilizzati internamente dall'[[interfaccia grafica]] [[GDI]]. Diversi [[Linguaggio di programmazione|linguaggi di programmazione]] per Windows hanno perciò sviluppato astrazioni specifiche per questo tipo di dati.
=== Windows API ===
L'[[API di Windows]] offre sin dalle prime versioni [[Funzione (informatica)|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 (informatica)|ambiente]] di [[Esecuzione (informatica)|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
I [[Linguaggio di programmazione ad alto livello|linguaggi di programmazione ad alto livello]] utilizzano in parte le funzioni API per implementare tecniche di [[programmazione]] grafica con le bitmap.▼
▲I [[Linguaggio di programmazione ad alto livello|linguaggi di programmazione ad alto livello]] utilizzano in parte le funzioni API per implementare tecniche di programmazione grafica con le bitmap.
=== .NET ===
Il [[Framework .NET|.NET Framework]] offre supporto nativo per diversi tipi d'immagini raster, e naturalmente anche per le bitmap tramite la [[Classe (informatica)|classe]] <tt>System.Drawing.Image.Bitmap</tt>. L'[[Integrated development environment|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 ===
A differenza del .NET Framework che è stato sviluppato dalla [[Microsoft]] soprattutto per Windows, [[Java (linguaggio)|Java]] si proprone di essere un sistema [[multipiattaforma]],
== Bibliografia ==
Line 357 ⟶ 379:
* {{en}} [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_99ir.asp Pagina della MSDN Library sulle bitmap]
* {{en}} [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_4v1h.asp
* {{
* {{en}} [http://wvnvaxa.wvnet.edu/vmswww/bmp.html
[[Categoria: Formati di file grafici]]
|