Arbeiten mit 16-Bit-RGB
Zwei Formate sind für 16-Bit-RGB-Unkomprimiert definiert:
- MEDIASUBTYPE 555 verwendet jeweils fünf Bits für die roten, grünen und blauen _ Komponenten in einem Pixel. Das wichtigste Bit in WORD wird ignoriert.
- MEDIASUBTYPE 565 verwendet fünf Bits für die roten und blauen Komponenten und sechs Bits _ für die grüne Komponente. Dieses Format spiegelt die Tatsache wider, dass das menschliche Sehen am empfindlichsten auf die grünen Teile des sichtbaren Spektrums reagieren kann.
RGB 565
Um die Farbkomponenten aus einem RGB 565-Bild zu extrahieren, behandeln Sie jedes Pixel als WORD-Typ, und verwenden Sie die folgenden Bitmasken:
WORD red_mask = 0xF800;
WORD green_mask = 0x7E0;
WORD blue_mask = 0x1F;
Erhalten Sie die Farbkomponenten wie folgt aus einem Pixel:
BYTE red_value = (pixel & red_mask) >> 11;
BYTE green_value = (pixel & green_mask) >> 5;
BYTE blue_value = (pixel & blue_mask);
Beachten Sie, dass der rote und der blaue Kanal 5 Bits und der grüne Kanal 6 Bits beträgt. Um diese Werte in 8-Bit-Komponenten (für 24-Bit- oder 32-Bit-RGB) zu konvertieren, müssen Sie die entsprechende Anzahl von Bits nach links verschieben:
// Expand to 8-bit values.
BYTE red = red_value << 3;
BYTE green = green_value << 2;
BYTE blue = blue_value << 3;
Kehren Sie diesen Vorgang um, um ein RGB-Pixel von 565 Pixeln zu erstellen. Angenommen, die Farbwerte wurden auf die richtige Anzahl von Bits abgeschnitten:
WORD pixel565 = (red_value << 11) | (green_value << 5) | blue_value;
RGB 555
Die Arbeit mit RGB 555 ist im Wesentlichen identisch mit RGB 565, außer dass sich die Bitmasken und Bitverschiebungsvorgänge unterscheiden. Gehen Sie wie folgt vor, um die Farbkomponenten aus einem RGB-Pixel von 555 Pixeln zu erhalten:
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);
// Expand to 8-bit values:
BYTE red = red_value << 3;
BYTE green = green_value << 3;
BYTE blue = blue_value << 3;
Gehen Sie wie folgt vor, um die Farbwerte für Rot, Grün und Blau in ein RGB-Pixel von 555 Pixeln zu packen:
WORD pixel565 = (red << 10) | (green << 5) | blue;