Как создать монохромную битовую маску для 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.

Идеи?

Ответы на вопрос(4)

Ваш ответ на вопрос