#c# #.net #image-processing #transparency #gif
#c# #.net #обработка изображений #прозрачность #gif
Вопрос:
Я пытаюсь отредактировать и сохранить изображение, используя класс .net Bitmap. Некоторые пиксели прозрачны, и при определенных обстоятельствах они преобразуются в черный цвет. Если я сохраню такое же изображение, как это:
image.Save("copy1.png", System.Drawing.Imaging.ImageFormat.Png);
image.Save("copy2.gif", System.Drawing.Imaging.ImageFormat.Gif);
image.Save("copy3.gif");
(Изображение изначально является gif) первое и третье являются правильными, сохраняя прозрачность, но среднее значение делает все прозрачные пиксели черными. Я не уверен, что я делаю не так, AFAIK, последние две строки должны быть эквивалентны.
Вот пример программы, о которой я говорю:
using System.Drawing;
using System.Net;
namespace TestGif
{
class Program
{
static void Main(string[] args)
{
Bitmap bitmap = new Bitmap(WebRequest.Create(
"http://rlis.com/images/column/ie_icon.gif")
.GetResponse()
.GetResponseStream());
int width = bitmap.Width;
int height = bitmap.Height;
Bitmap copy = new Bitmap(width, height);
var graphics = Graphics.FromImage(copy);
graphics.DrawImage(bitmap, new Point(0, 0));
copy.Save("copy1.png", System.Drawing.Imaging.ImageFormat.Png);
copy.Save("copy2.gif", System.Drawing.Imaging.ImageFormat.Gif);
copy.Save("copy3.gif");
}
}
}
Комментарии:
1. Чтобы проверить, совпадают ли последние 2 строки кода (вызовы сохранения), выполните copy2.gif и copy3.gif выходят как идентичные файлы? Или они разные? Я предполагаю, что расширения недостаточно, чтобы указать методу сохранения нужный формат изображения.
2. Третий вызов Save() фактически сохраняет PNG. Что не обманет ни одну программу, они будут смотреть на заголовок файла вместо расширения имени файла. Я бы предположил, что что-то не так с вашим устройством чтения GIF.
3. Я пытался добавить изображения к вопросу, но безрезультатно. copy2.gif не идентичен copy3.gif . Однако, как указывает второй комментатор, похоже, что это просто файл PNG, сохраненный под другим именем. Это кое-что объясняет, но не то, почему gif заменяет прозрачные пиксели черными.
Ответ №1:
Ваша последняя строка
copy.Save("copy3.gif");
сохраняется не как gif-файл, а как png, поскольку расширение недостаточно для указания формата сохранения.
Чтобы создать прозрачный gif, используйте что-то вроде
Color c = copy.GetPixel(0, 0);
copy.MakeTransparent(c);
Ваш код создает новое растровое изображение, возможно, теряя исходную информацию gif.
Комментарии:
1. Спасибо, Мишель, это попало в самую точку.