Compartir a través de


Trabajar con RGB de 16 bits

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Se definen dos formatos para RGB sin comprimir de 16 bits:

  • MEDIASUBTYPE_555 usa cinco bits cada uno para los componentes rojo, verde y azul en un píxel. Se omite el bit más significativo de WORD .
  • MEDIASUBTYPE_565 usa cinco bits para los componentes rojo y azul, y seis bits para el componente verde. Este formato refleja el hecho de que la visión humana es más sensible a las partes verdes del espectro visible.

RGB 565

Para extraer los componentes de color de una imagen RGB 565, trate cada píxel como un tipo WORD y use las máscaras de bits siguientes:

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

Obtenga los componentes de color de un píxel de la siguiente manera:

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

Recuerde que los canales rojo y azul son de 5 bits y el canal verde es de 6 bits. Para convertir estos valores en componentes de 8 bits (para RGB de 24 o 32 bits), debe desplazar a la izquierda el número adecuado de bits:

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

Invierte este proceso para crear un píxel RGB de 565 píxeles. Suponiendo que los valores de color se han truncado en el número correcto de bits:

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

RGB 555

Trabajar con RGB 555 es esencialmente el mismo que RGB 565, excepto las máscaras de bits y las operaciones de desplazamiento de bits son diferentes. Para obtener los componentes de color de un píxel RGB 555, haga lo siguiente:

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;

Para empaquetar los valores de color rojo, verde y azul en un píxel RGB 555, haga lo siguiente:

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

Subtipos de vídeo RGB sin comprimir