Compressione bitmap
Windows supporta i formati per comprimere le bitmap che definiscono i colori con 8 o 4 bit per pixel. La compressione riduce il disco e l'archiviazione di memoria necessari per la bitmap.
Quando il membro di compressione della struttura dell'intestazione delle informazioni bitmap è BI_RLE8, viene usato un formato di codifica a lunghezza di esecuzione (RLE) per comprimere una bitmap a 8 bit. Questo formato può essere compresso in modalità codificate o assolute. Entrambe le modalità possono verificarsi ovunque nella stessa bitmap:
- La modalità codificata è costituita da due byte: il primo byte specifica il numero di pixel consecutivi da disegnare usando l'indice di colore contenuto nel secondo byte. Inoltre, il primo byte della coppia può essere impostato su zero per indicare un carattere di escape che indica la fine di una riga, la fine di una bitmap o un delta, a seconda del valore del secondo byte. L'interpretazione dell'escape dipende dal valore del secondo byte della coppia, che può essere uno dei valori seguenti.
Valore | Significato |
---|---|
0 | Fine riga. |
1 | Fine della bitmap. |
2 | Delta. I 2 byte che seguono l'escape contengono valori senza segno che indicano l'offset verso destra e verso l'alto del pixel successivo dalla posizione corrente. |
- In modalità assoluta, il primo byte è zero e il secondo byte è un valore nell'intervallo 03H fino a FFH. Il secondo byte rappresenta il numero di byte che seguono, ognuno dei quali contiene l'indice di colore di un singolo pixel. Quando il secondo byte è due o meno, l'escape ha lo stesso significato della modalità codificata. In modalità assoluta, ogni esecuzione deve essere zero-padded per terminare su un limite di parole a 16 bit.
Nell'esempio seguente vengono illustrati i valori esadecimali di una bitmap compressa a 8 bit:
[03 04] [05 06] [00 03 45 56 67 00] [02 78] [00 02 05 01]
[02 78] [00 00] [09 1E] [00 01]
La bitmap si espande come indicato di seguito (i valori a due cifre rappresentano un indice di colore per un singolo pixel):
04 04 04
06 06 06 06 06
45 56 67
78 78
move current position 5 right and 1 up
78 78
end of line
1E 1E 1E 1E 1E 1E 1E 1E 1E
end of RLE bitmap
Quando il membro di compressione è BI_RLE4, la bitmap viene compressa usando un formato di codifica a lunghezza di esecuzione per una bitmap a 4 bit, che usa anche modalità codificate e assolute:
- In modalità codificata, il primo byte della coppia contiene il numero di pixel da disegnare usando gli indici di colore nel secondo byte. Il secondo byte contiene due indici di colore, uno nel suo ordine elevato 4 bit e uno nei suoi 4 bit di basso ordine. Il primo dei pixel viene disegnato usando il colore specificato dagli ordini elevati 4 bit, il secondo viene disegnato usando il colore nei 4 bit di basso ordine, il terzo viene disegnato usando il colore negli ordini elevati 4 bit e così via, fino a quando non sono stati disegnati tutti i pixel specificati dal primo byte.
- In modalità assoluta, il primo byte è zero. Il secondo byte contiene il numero di indici di colore che seguono. I byte successivi contengono indici di colore nei rispettivi bit elevati e bassi, un indice di colore per ogni pixel. In modalità assoluta, ogni esecuzione deve essere allineata a un limite di parola. Le escape end-of-line, end-of-bitmap e delta descritte per BI_RLE8 si applicano anche alla compressione BI_RLE4.
Nell'esempio seguente vengono illustrati i valori esadecimali di una bitmap compressa a 4 bit:
03 04 05 06 00 06 45 56 67 00 04 78 00 02 05 01
04 78 00 00 09 1E 00 01
La bitmap viene espansa come indicato di seguito (i valori a cifra singola rappresentano un indice di colore per un singolo pixel):
0 4 0
0 6 0 6 0
4 5 5 6 6 7
7 8 7 8
move current position 5 right and 1 up
7 8 7 8
end of line
1 E 1 E 1 E 1 E 1
end of RLE bitmap