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

本文关键字:删除 透明度 GIF 动画 | 更新日期: 2023-09-27 18:14:08

我不敢相信这个问题还没有被问到,但是…

如何将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();
    }
}

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

可以使用位图

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

如果位图破坏了动画,按照你帖子评论中描述的方式加载每一帧,然后把最后的缓冲区写回主图像内存。如果你想让我为这个上下文进行编辑,请注释