Использование Графики.DrawImage() для рисования изображения с прозрачностью / альфа-каналом

я копирую изображение. (Мой фактический код изменяет размер изображения, но это не относится к моему вопросу. Мой код выглядит примерно так.

Image src = ...

using (Image dest = new Bitmap(width, height))
{
    Graphics graph = Graphics.FromImage(dest);
    graph.InterpolationMode = InterpolationMode.HighQualityBicubic;
    graph.DrawImage(src, 0, 0, width, height);
    dest.Save(filename, saveFormat);
}

это, кажется, работает отлично, если src загружается из изображения с прозрачными пленками (например, GIF) или альфа-каналом (например, PNG).

как я могу получить DrawImage() перенести прозрачные пленки / альфа-канал на новое изображение, а затем сохранить их при сохранении файла?

1 ответов


Это довольно неясно, есть много, что вы не сказали. Самая большая проблема с прозрачностью заключается в том, что вы ее не видите. Вы пропустили пару шагов, вы явно не указали пиксельный формат вашего нового растрового изображения, вы вообще не инициализировали его и не сказали, какой формат вывода вы используете. Некоторые не поддерживают прозрачность. Итак, давайте сделаем версию, которая делает ее кристально ясной. Из PNG-изображения, которое выглядит так paint.net:

enter image description here

С помощью этого код

        using (var src = new Bitmap("c:/temp/trans.png"))
        using (var bmp = new Bitmap(100, 100, PixelFormat.Format32bppPArgb)) 
        using (var gr = Graphics.FromImage(bmp)) {
            gr.Clear(Color.Blue);
            gr.DrawImage(src, new Rectangle(0, 0, bmp.Width, bmp.Height));
            bmp.Save("c:/temp/result.png", ImageFormat.Png);
        }

производит этот образ:

enter image description here

вы можете четко видеть синий фон, чтобы прозрачность работала.