使用 16 位 RGB

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

为 16 位未压缩 RGB 定义了两种格式:

  • 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);

请记住,红色和蓝色通道为 5 位,绿色通道为 6 位。 若要将这些值转换为 8 位组件, (24 位或 32 位 RGB) ,必须向左移动适当的位数:

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

反转此过程以创建 RGB 565 像素。 假设颜色值已截断为正确的位数:

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

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);

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

若要将红色、绿色和蓝色值打包为 RGB 555 像素,请执行以下操作:

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

未压缩的 RGB 视频子类型