【问题标题】:Transparency and GIF in .NET -- Inconsistent behavior.NET 中的透明度和 GIF——不一致的行为
【发布时间】:2011-12-24 15:35:55
【问题描述】:

我正在尝试使用 .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");
        }
    }
}

【问题讨论】:

  • 要验证最后两行代码是否相同(Save 调用)是否将 copy2.gif 和 copy3.gif 作为相同的文件输出?还是他们不同?我的猜测是扩展不足以提示 Save 方法到你想要的 ImageFormat。
  • 第三个 Save() 调用实际上保存了一个 PNG。这不会欺骗任何程序,他们会查看文件头而不是文件扩展名。我猜你的 GIF 阅读器出了点问题。
  • 我尝试将图像添加到问题中,但无济于事。 copy2.gif 与 copy3.gif 不同。然而,正如第二位评论者指出的那样,它看起来确实只是以不同名称保存的 PNG 文件。这解释了一些事情,但不能解释为什么 gif 用黑色代替透明像素。

标签: c# .net image-processing transparency gif


【解决方案1】:

你的最后一行

copy.Save("copy3.gif");

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

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

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

【讨论】:

  • 感谢 Michele,这真是一针见血。
猜你喜欢
  • 1970-01-01
  • 2021-03-18
  • 2015-05-12
  • 2016-01-22
  • 2021-07-07
  • 2014-01-08
  • 2011-12-26
  • 2013-10-17
  • 2011-01-22
相关资源
最近更新 更多