Working with 16-bit RGB

[The feature associated with this page, DirectShow, is a legacy feature. It has been superseded by MediaPlayer, IMFMediaEngine, and Audio/Video Capture in Media Foundation. Those features have been optimized for Windows 10 and Windows 11. Microsoft strongly recommends that new code use MediaPlayer, IMFMediaEngine and Audio/Video Capture in Media Foundation instead of DirectShow, when possible. Microsoft suggests that existing code that uses the legacy APIs be rewritten to use the new APIs if possible.]

Two formats are defined for 16-bit uncompressed RGB:

  • MEDIASUBTYPE_555 uses five bits each for the red, green, and blue components in a pixel. The most significant bit in the WORD is ignored.
  • MEDIASUBTYPE_565 uses five bits for the red and blue components, and six bits for the green component. This format reflects the fact that human vision is most sensitive to the green portions of the visible spectrum.

RGB 565

To extract the color components from an RGB 565 image, treat each pixel as a WORD type and use the following bit masks:

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

Get the color components from a pixel as follows:

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

Remember that the red and blue channels are 5 bits and the green channel is 6 bits. To convert these values to 8-bit components (for 24-bit or 32-bit RGB), you must left-shift the appropriate number of bits:

// Expand to 8-bit values.
BYTE red   = red_value << 3;
BYTE green = green_value << 2;
BYTE blue  = blue_value << 3;

Reverse this process to create an RGB 565 pixel. Assuming the color values have been truncated to the correct number of bits:

WORD pixel565 = (red_value << 11) | (green_value << 5) | blue_value;

RGB 555

Working with RGB 555 is essentially the same as RGB 565, except the bit masks and bit shift operations are different. To get the color components from an RGB 555 pixel, do the following:

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;

To pack the red, green, and blue color values into an RGB 555 pixel, do the following:

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

Uncompressed RGB Video Subtypes