Вопрос по c#, .net – Использование 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()
перенести прозрачные / альфа-каналы на новое изображение, а затем сохранить их при сохранении файла?
saveFormat
для файлов GIF:)?
ImageFormat.Gif
.
saveFormat
будет варьироваться в зависимости от формата входного файла. Если входной файл не поддерживает альфа-канал, можно предположить, что изображение не будет содержать пиксели альфа-канала.
saveFormat
переменная? Должен бытьPixelFormat.Format32bppArgb
(или другой формат с обработанным альфа-каналом). Попробуйте также:using (Image dest = new Bitmap(width, height, 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);
}
Производит это изображение:
Вы можете ясно видеть синий фон, чтобы прозрачность работала.
using
оператор, создайте графический объектFromImage(
твое новое растровое изображение)
а такжеDrawImage(
твое старое растровое изображение)
.