ビットマップ圧縮
Windows では、ピクセルあたり 8 ビットまたは 4 ビットで色を定義するビットマップを圧縮するための形式がサポートされています。 圧縮により、ビットマップに必要なディスクとメモリのストレージが削減されます。
ビットマップ情報ヘッダー構造の Compression メンバーがBI_RLE8されると、8 ビット ビットマップを圧縮するために実行長エンコード (RLE) 形式が使用されます。 この形式は、エンコードモードまたは絶対モードで圧縮できます。 どちらのモードも、同じビットマップ内の任意の場所で発生する可能性があります。
- エンコード モード は 2 バイトで構成されます。最初のバイトは、2 番目のバイトに含まれるカラー インデックスを使用して描画される連続するピクセル数を指定します。 さらに、2 番目のバイトの値に応じて、行の末尾、ビットマップの末尾、またはデルタを示すエスケープ文字を示すために、ペアの最初のバイトを 0 に設定できます。 エスケープの解釈は、ペアの 2 番目のバイトの値によって異なります。値は次のいずれかになります。
価値 | 意味 |
---|---|
0 | 行末。 |
1 | ビットマップの末尾。 |
2 | 三角州。 エスケープの後の 2 バイトには、現在の位置からの次のピクセルの右と上へのオフセットを示す符号なし値が含まれています。 |
- 絶対モード 、最初のバイトは 0 で、2 番目のバイトは 03H から FFH までの範囲の値です。 2 番目のバイトは後続のバイト数を表し、各バイトには 1 つのピクセルのカラー インデックスが含まれます。 2 番目のバイトが 2 以下の場合、エスケープはエンコード モードと同じ意味を持ちます。 絶対モードでは、各実行を 16 ビットワード境界で末尾に埋め込む必要があります。
次の例は、8 ビット圧縮ビットマップの 16 進数の値を示しています。
[03 04] [05 06] [00 03 45 56 67 00] [02 78] [00 02 05 01]
[02 78] [00 00] [09 1E] [00 01]
ビットマップは次のように展開されます (2 桁の値は 1 ピクセルのカラー インデックスを表します)。
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
Compression メンバーがBI_RLE4されると、ビットマップは 4 ビット ビットマップの実行長エンコード形式を使用して圧縮され、エンコードモードと絶対モードも使用されます。
- エンコード モードでは、ペアの最初のバイトには、2 番目のバイトのカラー インデックスを使用して描画されるピクセル数が含まれます。 2 番目のバイトには 2 つのカラー インデックスが含まれています。1 つは上位 4 ビットで、もう 1 つは下位 4 ビットです。 1 番目のピクセルは上位 4 ビットで指定された色を使用して描画され、2 番目のピクセルは下位 4 ビットの色を使用して描画され、3 番目のピクセルは上位 4 ビットの色を使用して描画されます。1 番目のバイトで指定されたすべてのピクセルが描画されるまで描画されます。
- 絶対モードでは、最初のバイトは 0 です。 2 番目のバイトには、後に続くカラー インデックスの数が含まれます。 後続のバイトには、上位 4 ビットと下位 4 ビットのカラー インデックスが含まれており、ピクセルごとに 1 つのカラー インデックスが含まれます。 絶対モードでは、各実行を単語の境界に配置する必要があります。 BI_RLE8で説明されている行末、ビットマップの終わり、デルタのエスケープは、BI_RLE4圧縮にも適用されます。
次の例は、4 ビット圧縮ビットマップの 16 進数の値を示しています。
03 04 05 06 00 06 45 56 67 00 04 78 00 02 05 01
04 78 00 00 09 1E 00 01
ビットマップは次のように展開されます (1 桁の値は 1 ピクセルのカラー インデックスを表します)。
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