2015-09-23 2 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

Если растровое изображение разбивает анимацию, загрузите каждый кадр, как описано в комментариях вашего сообщения, а затем напишите окончательный буфер обратно в память основного изображения. Комментарий, если вы хотите, чтобы я редактировал для этого контекста.

Смежные вопросы