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

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как создать монохромную битовую маску для 32-битного растрового изображения

Сообщение Anonymous »

В 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-битного источника цвета.

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

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

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

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

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

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

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

Код: Выделить всё

HBITMAP CreateTransparencyMask(HDC hdc, HBITMAP hSource, COLORREF crTransparency);
Где всегда создается действительная маска прозрачности, независимо от глубины цвета hSource.

Подробнее здесь: https://stackoverflow.com/questions/394 ... bit-bitmap
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»