Под Win32, это распространенный методом для создания монохромной битовой маски из растрового изображения для использования прозрачности, выполнив следующие действия:Как genrate монохромных битовой маски для 32-битного растрового
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-битных цветных изображений? Есть ли проблема с альфа-каналом, который переопределяет нормальное поведение вышеупомянутого метода?
Спасибо за любую помощь, которую вы, возможно, должны будете предложить!
ADDENDUM: Мне все еще не удается найти технику, которая создает допустимый монохромный растровый рисунок для моего GDI + созданного исходного растрового изображения.
Я несколько смягчил свою конкретную проблему, просто не создавая монохромную битовую маску вообще, и вместо этого я использую TransparentBlt(), который, кажется, правильно это понимает (но я не знаю, что они делают внутри это совсем другое, что позволяет им правильно маскировать изображение).
Это может быть полезно иметь очень хорошую, рабочую функцию:
HBITMAP CreateTransparencyMask(HDC hdc, HBITMAP hSource, COLORREF crTransparency);
Где она всегда создает действительную маску прозрачности, независимо от глубины цвета hSource.
Идеи?
GDI застрял в 24bpp. TransparentBlt() немного необычен, документируется поддержка 32bpp. Время переместиться в GDI + возможно. –