Как создать монохромную битовую маску для 32-битного растрового изображения
Под Win32 это обычная техника для создания монохромной битовой маски из битовой карты для прозрачности, используя следующие действия:
SetBkColor(hdcSource, clrTransparency);
VERIFY(BitBlt(hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, hdcSource, 0, 0, SRCCOPY));
Это предполагает, что hdcSource - это DC памяти, содержащий исходное изображение, а hdcMask - DC памяти, содержащий монохромное растровое изображение одинакового размера (поэтому оба имеют размер 32x32, но источник имеет 4-битный цвет, а цель - 1-битный монохромный).
Однако, мне кажется, что это не сработает, когда источник 32-битный цвет + альфа. Вместо монохромного растрового изображения в hdcMask, я получаю маску, которая полностью черная. Биты не устанавливаются в белый цвет (1). Принимая во внимание, что это работает для 4-битного источника цвета.
Моя поисковая система не работает, так как я не могу найти никаких ссылок на эту конкретную проблему.
Я выделил, что это действительно проблема в моем коде: то есть, если я использую исходное растровое изображение 16 цветов (4 бита), оно работает; если я использую 32-битное изображение, оно создает полностью черную маску.
Есть ли альтернативный метод, который я должен использовать в случае 32-битных цветных изображений? Есть ли проблема с альфа-каналом, который перекрывает нормальное поведение вышеупомянутой техники?
Спасибо за любую помощь, которую вы можете предложить!
ДОБАВЛЕНИЕ: Я все еще не могу найти технику, которая создает действительное монохромное растровое изображение для моего созданного растрового изображения GDI +.
Я несколько смягчил свою конкретную проблему, просто вообще не создавая монохромную битовую маску, и вместо этого я использую TransparentBlt (), которая, кажется, делает это правильно (но я не знаю, что они делают внутри, это совсем не то, что позволяет им правильно маскировать изображение).
Может быть полезно иметь действительно хорошую работающую функцию:
HBITMAP CreateTransparencyMask(HDC hdc, HBITMAP hSource, COLORREF crTransparency);
Где это всегда создает действительную маску прозрачности, независимо от глубины цвета hSource.
Идеи?