我无法相信这还没有被问到,但是......
如何在不破坏动画的情况下将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();
}
}
答案 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
如果位图中断了动画,请按照帖子的注释中的说明加载每个帧,然后将最终缓冲区写回主图像内存。如果您希望我为此上下文进行编辑,请进行评论。