Использование Graphics.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() перенести прозрачные / альфа-каналы на новое изображение, а затем сохранить их при сохранении файла?

 Lukasz M18 мая 2012 г., 22:18
Так, какова ценностьsaveFormat для файлов GIF:)?
 Jonathan Wood18 мая 2012 г., 22:20
В таком случае этоImageFormat.Gif.
 Jonathan Wood18 мая 2012 г., 22:13
Это похоже на альфа-каналы, но не на прозрачные пленки GIF.saveFormat будет варьироваться в зависимости от формата входного файла. Если входной файл не поддерживает альфа-канал, можно предположить, что изображение не будет содержать пиксели альфа-канала.
 Lukasz M18 мая 2012 г., 22:05
Вопрос в том, какова ценностьsaveFormat переменная? Должен бытьPixelFormat.Format32bppArgb (или другой формат с обработанным альфа-каналом). Попробуйте также:using (Image dest = new Bitmap(width, height, PixelFormat.Format32bppArgb)).
 Lukasz M18 мая 2012 г., 22:23
Спасибо за быстрый ответ. Тем временем я нашел статью о прозрачности GIF. Посмотрите на это: Support.microsoft.com / кб / 319061. Я полагаю, что в основном вам просто нужно получить палитру изображения и установить прозрачный цвет, сохраненный в первом индексе.

Ответы на вопрос(2)

потому что у меня была та же проблема (т.е. DrawImage не копировал альфа-канал), но в моем случае это было просто потому, что я упустил из виду, что использовалPixelFormat.Format32bppRgb вместо тогоPixelFormat.Format32bppArgb. Так во многом то, что Лукаш М сказал в комментария

Решение Вопроса

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

Используя этот код

        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);
        }

Производит это изображение:

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

 Jonathan Wood19 мая 2012 г., 03:42
Хорошо, я намеревался поддерживать любой формат, соответствующий входному файлу. Я думал, что я был довольно конкретным. Просто код не предназначен для поддержки только одного типа файлов. Возможно, мне нужна куча кода для обработки каждого типа файла - я не знаю. Я попытался указать PixelFormat, как вы, но потом казалось, что это вызывает ошибки, когда тип файла GIF с прозрачностью. И, на самом деле, некоторые вариации прекрасно работали с PNG без указания PixelFormat.
 user188140020 февр. 2016 г., 17:10
@ JonathanWood создайте новое растровое изображение с шириной и высотой старого растрового изображения и вашим новым желаемым форматом. Желательно вusing оператор, создайте графический объектFromImage( твое новое растровое изображение) а такжеDrawImage( твое старое растровое изображение).

Ваш ответ на вопрос