Как сгенерировать монохромную битовую маску для 32-битного растрового изображения

В Win32 обычным методом является генерация монохромной битовой маски из растрового изображения для использования прозрачности путем выполнения следующих действий:

SetBkColor(hdcSource, clrTransparency);
VERIFY(BitBlt(hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, hdcSource, 0, 0, SRCCOPY));

Предполагается, что hdcSource является контроллером домена памяти, содержащим исходное изображение, а hdcMask - контроллером домена памяти, содержащим монохромное растровое изображение одинакового размера (так что оба имеют размер 32x32, но исходный цвет имеет 4-битный цвет, а целевой - 1-битный монохромный).

Однако мне кажется, что это не работает, когда исходный код имеет 32-битный цвет + альфа. Вместо монохромного растрового изображения в hdcMask я получаю маску полностью черного цвета. Никакие биты не устанавливаются на белый цвет (1). В то время как это работает для 4-битного источника цвета.

Мой search-foo не работает, так как я не могу найти никаких ссылок на эту конкретную проблему.

Я выделил, что это действительно проблема в моем коде: т.е. если я использую исходное растровое изображение с 16 цветами (4 бита), оно работает; если я использую 32-битное изображение, получается полностью черная маска.

Есть ли альтернативный метод, который мне следует использовать в случае 32-битных цветных изображений? Есть ли проблема с альфа-каналом, которая отменяет нормальное поведение описанной выше техники?

Спасибо за любую помощь, которую вы можете предложить!

ДОБАВЛЕНИЕ: Я все еще не могу найти метод, который создает допустимое монохромное растровое изображение для моего исходного растрового изображения, созданного GDI +.

Я несколько облегчил мою конкретную проблему, просто не создав монохромную битовую маску вообще, и вместо этого я использую TransparentBlt (), который, кажется, все правильно (но я не знаю, что они делают внутри, что любое другое, что позволяет им правильно маскировать изображение).

Может быть полезно иметь действительно хорошую работающую функцию:

HBITMAP CreateTransparencyMask(HDC hdc, HBITMAP hSource, COLORREF crTransparency);

Где она всегда создает допустимую маску прозрачности, независимо от глубины цвета hSource.

8
задан Cœur 25 June 2019 в 14:59
поделиться