如何从动画GIF中删除透明度?

时间:2015-09-23 18:45:22

标签: c# .net image transparency gif

我无法相信这还没有被问到,但是......

如何在不破坏动画的情况下将GIF图像的透明背景替换为白色?

我离开了我的领域,所以我几乎失去了(我真的不知道该怎么做)。

这是我没有运气的尝试:

public byte[] RemoveTransparency(byte[] gifBytes)
{
    using(MemoryStream gifStream = new MemoryStream(gifBytes))
    using(Image gifImage = Image.FromStream(gifStream))
    using(Image newImage = new Bitmap(gifImage.Width, gifImage.Height, PixelFormat.Format32bppPArgb))
    using(MemoryStream newImageStream = new MemoryStream())
    {
        Color background = Color.White;

        newImage.SetResolution(gifImage.HorizontalResolution, gifImage.VerticalResolution);
        using (Graphics graphics = Graphics.FromImage(newImage))
        {
            graphics.Clear(background );
            graphics.DrawImage(gifImage, 0, 0, gifImage.Width, gifImage.Height);
        }
        newImage.Save(newImageStream);
        return newImageStream.ToArray();
    }
}

1 个答案:

答案 0 :(得分:1)

您可以使用位图。

using(var ms = new MemoryStream(gifBytes))
    using(var b = new Bitmap(Image.FromStream(ms)))
    {
        for(var y = 0; y < b.Height; ++y)
            for(var x = 0; x < b.Width; ++x)
                if(b.GetPixel(x, y).A == 0) //Completely opaque
                    b.SetPixel(x, y, Color.White); //Sets white
    }
//Note: b goes out of scope here and will be deleted eventually.

请注意,此算法在大型图像上速度极慢,解决此问题的典型方法是直接访问内部缓冲区,这需要不安全的上下文。请参阅MSDN位图参考或此:https://msdn.microsoft.com/en-us/library/5ey6h79d(v=vs.110).aspx

如果位图中断了动画,请按照帖子的注释中的说明加载每个帧,然后将最终缓冲区写回主图像内存。如果您希望我为此上下文进行编辑,请进行评论。