Поддержка полупрозрачных пикселей в методах GDI + Graphics.DrawImage () - PullRequest
0 голосов
/ 17 февраля 2020

Мне нужно рисовать 32-битные изображения PNG с полупрозрачными пикселями, загруженными в элемент управления ImageList на графике, когда прямоугольники клипа могут быть применены к этому чертежу. Оказалось, что я не могу сделать это с помощью метода Graphics.DrawImage () . Полупрозрачные пиксели просто стали серыми, когда я попытался вызвать некоторые перегруженные версии Graphics.DrawImage.

. Например, посмотрите на следующую картинку:

enter image description here

Изображение выше было создано с помощью следующего переопределенного метода OnPaint вида:

protected override void OnPaint(PaintEventArgs e)
{
  imageList1.Draw(e.Graphics, 10, 30, 0);

  e.Graphics.DrawImage(imageList1.Images[0], 10, 90);

  base.OnPaint(e);
}

Как видите, первый ImageList.Draw () основан на методе в Win32 API функция ImageList_DrawEx правильно отображает полупрозрачные пиксели, а методы GDI + Graphics - нет. Я был бы рад использовать ImageList.Draw, поскольку он работает правильно, но прямоугольники клипа GDI + не работают с ним (из-за его природы GDI).

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


Если это может помочь, я загрузил изображение в элемент управления ImageList во время разработки следующим образом:

  1. Уронил элемент управления ImageList на поверхность дизайнера.
  2. Установите для свойства ColorDepth значение Depth32Bit.
  3. Установите свойство ImageSize (48, 48 для этого значка теста).
  4. Нажмите кнопку с многоточием в редакторе свойства Images и добавили значок в Редакторе коллекции изображений с помощью кнопки Добавить.

enter image description here

Тестовый значок мобильного телефона размером 48x48, который я использовал, можно загрузить с этого источника .

1 Ответ

1 голос
/ 05 марта 2020

Возможно, вы захотите проверить графическое свойство CompositingMode.

Должно быть установлено значение e.Graphics.CompositingMode = CompositingMode.SourceOver;.

Если нет, графический объект не использует прозрачность. Я предполагаю, что это делается неявно с помощью элемента управления ImageList, если вы используете его метод рисования.

...