Bitmapkomprimierung

Windows unterstützt Formate zum Komprimieren von Bitmaps, die ihre Farben mit 8 oder 4 Bit pro Pixel definieren. Die Komprimierung reduziert den für die Bitmap erforderlichen Datenträger- und Arbeitsspeicherspeicher.

Wenn das Komprimierungselement der Bitmapinformationsheaderstruktur BI_RLE8 ist, wird ein RLE-Format (Run-Length Encoding) verwendet, um eine 8-Bit-Bitmap zu komprimieren. Dieses Format kann im codierten oder absoluten Modus komprimiert werden. Beide Modi können überall in derselben Bitmap auftreten:

  • Der codierte Modus besteht aus zwei Bytes: Das erste Byte gibt die Anzahl aufeinanderfolgender Pixel an, die mit dem Farbindex im zweiten Byte gezeichnet werden sollen. Darüber hinaus kann das erste Byte des Paares auf 0 festgelegt werden, um ein Escapezeichen anzugeben, das je nach Wert des zweiten Byte das Ende einer Linie, das Ende einer Bitmap oder ein Delta bezeichnet. Die Interpretation des Escapezeichens hängt vom Wert des zweiten Byte des Paares ab, bei dem es sich um einen der folgenden Werte handeln kann.
Wert Bedeutung
0 Zeilenende.
1 Ende der Bitmap.
2 Delta. Die 2 Bytes nach dem Escapezeichen enthalten unsignierte Werte, die den Offset rechts und oben des nächsten Pixels von der aktuellen Position anzeigen.

 

  • Im absoluten Modus ist das erste Byte 00 und das zweite Byte ein Wert im Bereich von 03H bis FFH. Das zweite Byte stellt die Anzahl der folgenden Bytes dar, die jeweils den Farbindex eines einzelnen Pixels enthält. Wenn das zweite Byte zwei oder weniger ist, hat das Escape die gleiche Bedeutung wie der codierte Modus. Im absoluten Modus muss jede Ausführung 00 sein, um auf einer 16-Bit-Wortgrenze zu enden.

Das folgende Beispiel zeigt die Hexadezimalwerte einer komprimierten 8-Bit-Bitmap:

[03 04] [05 06] [00 03 45 56 67 00] [02 78] [00 02 05 01] 
[02 78] [00 00] [09 1E] [00 01] 

Die Bitmap wird wie folgt erweitert (zweistellige Werte stellen einen Farbindex für ein einzelnes Pixel dar):

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 

Wenn das Komprimierungselement BI_RLE4 ist, wird die Bitmap mithilfe eines Codierungsformats mit Laufzeitlänge für eine 4-Bit-Bitmap komprimiert, die auch codierte und absolute Modi verwendet:

  • Im codierten Modus enthält das erste Byte des Paares die Anzahl der Pixel, die mit den Farbindizes im zweiten Byte gezeichnet werden sollen. Das zweite Byte enthält zwei Farbindizes, einen in seiner hohen Reihenfolge 4 Bits und einen in seinen 4 Bits in niedriger Reihenfolge. Der erste der Pixel wird mit der Farbe gezeichnet, die durch die hohen 4 Bits angegeben wird, der zweite wird mit der Farbe in der niedrigen Reihenfolge 4 Bits gezeichnet, der dritte wird mit der Farbe in den hohen 4 Bits gezeichnet usw., bis alle vom ersten Byte angegebenen Pixel gezeichnet wurden.
  • Im absoluten Modus ist das erste Byte 0. Das zweite Byte enthält die Anzahl der folgenden Farbindizes. Nachfolgende Bytes enthalten Farbindizes in ihren 4 Bits hoher und niedriger Reihenfolge, jeweils einen Farbindex für jedes Pixel. Im absoluten Modus muss jede Ausführung an einer Wortgrenze ausgerichtet werden. Die für BI_RLE8 beschriebenen Zeilenende-, Bitmap- und Delta-Escapes gelten auch für BI_RLE4 Komprimierung.

Das folgende Beispiel zeigt die Hexadezimalwerte einer komprimierten 4-Bit-Bitmap:

03 04 05 06 00 06 45 56 67 00 04 78 00 02 05 01 
04 78 00 00 09 1E 00 01 

Die Bitmap wird wie folgt erweitert (einstellige Werte stellen einen Farbindex für ein einzelnes Pixel dar):

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