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