Trabalhando com RGB de 16 bits
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]
Dois formatos são definidos para RGB descompactado de 16 bits:
- MEDIASUBTYPE_555 usa cinco bits cada para os componentes vermelho, verde e azul em um pixel. O bit mais significativo no WORD é ignorado.
- MEDIASUBTYPE_565 usa cinco bits para os componentes vermelho e azul e seis bits para o componente verde. Esse formato reflete o fato de que a visão humana é mais sensível às partes verdes do espectro visível.
RGB 565
Para extrair os componentes de cor de uma imagem RGB 565, trate cada pixel como um tipo WORD e use as seguintes máscaras de bits:
WORD red_mask = 0xF800;
WORD green_mask = 0x7E0;
WORD blue_mask = 0x1F;
Obtenha os componentes de cor de um pixel da seguinte maneira:
BYTE red_value = (pixel & red_mask) >> 11;
BYTE green_value = (pixel & green_mask) >> 5;
BYTE blue_value = (pixel & blue_mask);
Lembre-se de que os canais vermelho e azul são de 5 bits e o canal verde é de 6 bits. Para converter esses valores em componentes de 8 bits (para RGB de 24 bits ou 32 bits), você deve deslocar para a esquerda o número apropriado de bits:
// Expand to 8-bit values.
BYTE red = red_value << 3;
BYTE green = green_value << 2;
BYTE blue = blue_value << 3;
Inverta esse processo para criar um RGB de 565 pixels. Supondo que os valores de cor tenham sido truncados para o número correto de bits:
WORD pixel565 = (red_value << 11) | (green_value << 5) | blue_value;
RGB 555
Trabalhar com RGB 555 é essencialmente o mesmo que RGB 565, exceto que as máscaras de bits e as operações de bit shift são diferentes. Para obter os componentes de cor de um RGB de 555 pixels, faça o seguinte:
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 empacotar os valores de cor vermelho, verde e azul em um RGB de 555 pixels, faça o seguinte:
WORD pixel565 = (red << 10) | (green << 5) | blue;
Tópicos relacionados