Вопрос по c#, .net – Использование Graphics.DrawImage () для рисования изображения с прозрачностью / альфа-каналом

15

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

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

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

Ваш Ответ

2   ответа
28

ты многое не сказал. Самая большая проблема с прозрачностью заключается в том, что вы не можете ее видеть. Вы пропустили пару шагов, вы не указали явно формат пикселя вашего нового растрового изображения, вы вообще его не инициализировали и не сказали, какой выходной формат вы используете. Некоторые не поддерживают прозрачность. Итак, давайте сделаем версию, которая делает это кристально ясным. Из 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);
        }

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

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

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

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

Похожие вопросы