透明度和GIF在.NET中的不一致行为

5

我正在尝试使用 .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格式)第一张和第三张图像保留了透明度,但第二张将所有透明像素设置为黑色。我不确定自己做错了什么,据我所知,最后两行应该是等价的。

以下是一个示例程序:

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

要验证代码的最后两行是否相同(即Save调用),copy2.gif和copy3.gif是否成为相同的文件?还是它们不同?我猜测扩展名不足以提示Save方法您想要的ImageFormat。 - Victor Chelaru
7
第三个Save()调用实际上保存了一个PNG格式的文件。这不会欺骗任何程序,它们会查看文件头而不是文件扩展名。我猜你的GIF阅读器有问题。 - Hans Passant
我试图将图片添加到问题中,但无济于事。copy2.gif与copy3.gif不相同。然而,正如第二个评论者指出的那样,它看起来只是以不同的名称保存的PNG文件。这解释了一些问题,但并没有解释为什么gif会用黑色代替透明像素。 - Fred Thomas
1个回答

3
你的最后一行
copy.Save("copy3.gif");

不保存为gif文件,而是保存为png文件,因为扩展名不足以指定保存格式。 要制作透明的gif,请使用类似以下的内容:

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

您的代码正在创建一个新的位图,可能会丢失原始gif信息。


谢谢Michele,你说得一点没错。 - Fred Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接