В 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.