Прозрачность и GIF в .NET - Непоследовательное поведение - PullRequest
5 голосов
/ 08 ноября 2011

Я пытаюсь отредактировать и сохранить изображение, используя класс .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 Ответ

3 голосов
/ 08 ноября 2011

Ваша последняя строка

copy.Save("copy3.gif");

не сохраняется как файл gif, но как png, поскольку расширение недостаточно для указания формата сохранения. Чтобы сделать прозрачный GIF, используйте что-то вроде

Color c = copy.GetPixel(0, 0);
copy.MakeTransparent(c);

Ваш код создает новое растровое изображение, возможно, теряя исходную информацию GIF.

...