我如何从动画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();
}
}
可以使用位图
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
如果位图破坏了动画,按照你帖子评论中描述的方式加载每一帧,然后把最后的缓冲区写回主图像内存。如果你想让我为这个上下文进行编辑,请注释