Как создать значок оттенков серого с правильной прозрачностью?
Привет,
У меня есть некоторый код, который использует GDI+ для преобразования значка в оттенки серого*. Однако, когда задействована прозрачность (то есть альфа-канал), результирующий значок, кажется, использует предварительно умноженную Альфа - а не обычную Альфа - АМУ, что делает прозрачные пиксели более темными.
* Создание интерфейса GDI+ растрового изображения из HICON, создать пустой точечный рисунок, нарисовать значок, точечный рисунок на новый точечный рисунок с помощью цветовой матрицы, преобразовать растровое изображение в HICON.
Что я уже пробовал:
Я обнаружил, что при рисовании на экране с помощью графического класса GDI+ он выглядит нормально. Это происходит только при обратном преобразовании в иконку с помощью Растровое Изображение::GetHICON что проблема возникает. Это наводит меня на мысль, что функция GetHICON неявно преобразует изображение в предварительно умноженную Альфа-форму.
Кажется, не имеет значения, использую ли я PixelFormat32bppARGB или PixelFormat32bppPARGB в любой момент, как я получаю тот же эффект.
Aydin Homay
Пожалуйста, опубликуйте свой код и объясните на коде, что вы пытаетесь сделать
XTAL256
Код довольно сложный, и будет трудно сделать простой пример, чтобы продемонстрировать мою проблему.
Однако, поскольку вы побудили меня снова взглянуть на код, я думаю, что вижу, в чем проблема. Код, который преобразует HICON в GDI+ Bitmap, пытается сделать некоторые хитрые вещи с альфа-каналом иконок 32-bpp.
В частности, мой код вызывает Bitmap::FromHBITMAP и передает цветовое растровое изображение значка (полученное из GetIconInfo). Затем он копирует пиксельные данные в растровое изображение GDI+.
Если вместо этого я вызываю Bitmap::FromHICON, то 8-битный альфа-канал не сохраняется и вместо него используется 1-битная маска.
Я буду исследовать этот код дальше.
Michael Haephrati
Я думаю, что вы должны вызвать SetColorKey с правильной прозрачностью