Поделиться через


Работа с 16-разрядной rgb-версией

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

Для 16-разрядной несжатой rgb-памяти определены два формата:

  • MEDIASUBTYPE_555 использует по пять битов для красного, зеленого и синего компонентов в пикселях. Самый важный бит в WORD игнорируется.
  • MEDIASUBTYPE_565 использует пять битов для красного и синего компонентов и шесть битов для зеленого компонента. Этот формат отражает тот факт, что человеческое зрение наиболее чувствительно к зеленым частям видимого спектра.

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