ビットマップ圧縮

Windows では、8 ビットまたは 4 ビット/ピクセルで色を定義するビットマップを圧縮するための形式がサポートされています。 圧縮により、ビットマップに必要なディスクとメモリのストレージが削減されます。

ビットマップ情報ヘッダー構造体の Compression メンバーがBI_RLE8されると、8 ビット ビットマップを圧縮するために実行長エンコード (RLE) 形式が使用されます。 この形式は、エンコードモードまたは絶対モードで圧縮できます。 どちらのモードも、同じビットマップ内の任意の場所で実行できます。

  • エンコード モードは 2 バイトで構成されます。最初のバイトは、2 番目のバイトに含まれるカラー インデックスを使用して描画される連続するピクセル数を指定します。 さらに、ペアの最初のバイトを 0 に設定して、2 番目のバイトの値に応じて、行の末尾、ビットマップの末尾、またはデルタを示すエスケープ文字を示すことができます。 エスケープの解釈は、ペアの 2 番目のバイトの値によって異なります。値は次のいずれかになります。
説明
0 行の末尾。
1 ビットマップの末尾。
2 デルタ。 エスケープの後の 2 バイトには、現在の位置からの次のピクセルの右と上へのオフセットを示す符号なしの値が含まれています。

 

  • 絶対モードでは、最初のバイトは 0 で、2 番目のバイトは 03H から FFH までの範囲の値です。 2 番目のバイトは、後続のバイト数を表し、各バイトには 1 つのピクセルの色インデックスが含まれます。 2 番目のバイトが 2 以下の場合、エスケープはエンコード モードと同じ意味を持ちます。 絶対モードでは、各実行は、16 ビットワード境界で終わるまで 0 で埋め込む必要があります。

次の例は、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 ビットのカラー インデックスが含まれます。ピクセルごとに 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