16 ビット RGB の操作

16 ビット非圧縮 RGB では 2 つのフォーマットが定義されている。

  • MEDIASUBTYPE_555 では、ピクセル内の赤、緑、青の各成分について 5 ビットを使用する。WORD 内の最上位ビットは無視される。
  • MEDIASUBTYPE_565 では、赤と青の成分については 5 ビットを使用し、緑の成分については 6 ビットを使用する。このフォーマットは、人間の視覚が可視スペクトルの緑の部分に最も敏感であるという事実を反映している。

RGB 565

RGB 565 イメージから色成分を抽出するには、各ピクセルを WORD 型として処理し、次のビット マスクを使用する。

WORD red_mask = 0xF800;
WORD green_mask = 0x7E0;
WORD blue_mask = 0x1F;

次のようにピクセルから色成分を取得する。

BYTE red_value = (pixel & red_mask) >> 11;
BYTE green_value = (pixel & green_mask) >> 5;
BYTE blue_value = (pixel & blue_mask);

この処理を逆にして RGB 565 ピクセルを作成する。

WORD pixel565 = (red << 11) | (green << 5) | blue;

このコードでは、色値が既に適切なビット数に切り詰められていると仮定している。赤、緑、青の値は単一の WORD 値にパックされる。

RGB 555

RGB 555 の操作は基本的に RGB 565 と同じである。ただし、ビット マスクとビット シフト演算が異なる。RGB 555 ピクセルから色成分を取得するには、次のようにする。

WORD red_mask = 0x7C00;
WORD green_mask = 0x3E0;
WORD blue_mask = 0x1F;

BYTE red_value = (pixel & red_mask) >> 10;
BYTE green_value = (pixel & green_mask) >> 5;
BYTE blue_value = (pixel & blue_mask);

赤、緑、青の色値を RGB 555 ピクセルにパックするには、次のようにする。

WORD pixel565 = (red << 10) | (green << 5) | blue;

参照