2015-09-23 84 views
0

我不能相信這個問題還沒有被問到,但是...如何從動畫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(); 
    } 
} 
+0

也許這可能會幫助你:http://stackoverflow.com/questions/618259/remove-transparency-in-images-with-c-sharp –

+0

@ErikAuranaune該解決方案將打破我的GIF動畫 –

+0

爲什麼downvote? :( –

回答

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

如果位圖中斷了動畫,請按照文章評論中所述加載每個幀,然後將最終緩衝區寫回主圖像內存。評論你是否希望我編輯這個上下文。