XTAL256 Ответов: 0

Как создать значок оттенков серого с правильной прозрачностью?


Привет,

У меня есть некоторый код, который использует 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 с правильной прозрачностью

0 Ответов