C#gif图像到MemoryStream并返回(丢失动画)

时间:2012-01-06 19:53:44

标签: c# animation stream gif

我有一个小问题,我找不到任何解决方案。 我想将GIF转换为byte []然后再转换为GIF。我工作正常,但我失去了动画。

当我开始时它是一个完美的动画GIF(我在PictureBox元素中显示它)。但是转换后我遇到了第一帧。

HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create("creativetechs.com/i/tip_images/ExampleAnimation.gif");
HttpWebResponse httpWebReponse = (HttpWebResponse)httpWebRequest.GetResponse();
Stream stream = httpWebReponse.GetResponseStream();
Image img = Image.FromStream(stream);

MemoryStream ms = new MemoryStream();
img.Save(ms,img.RawFormat);
byte [] bytes = ms.ToArray();
Image img2 = Image.FromStream(new MemoryStream(bytes));

int frames1 = img.GetFrameCount(System.Drawing.Imaging.FrameDimension.Time);
int frames2 = img2.GetFrameCount(System.Drawing.Imaging.FrameDimension.Time);

我还尝试使用RawFormat而不是System.Drawing.Imaging.ImageFormat.Gif。没改变一件事。 frames1是正确的帧数。 frames2为1。

我的GUI中有2个PictureBox个元素。一个显示img,另一个显示img2。但是img2是动态的img。有什么问题?

我还尝试使用序列化来创建我的byte []。

我将图像序列化并再次反序列化,它也没有改变任何东西。这怎么可能?

3 个答案:

答案 0 :(得分:9)

Stream加载图像时,.NET框架会检测到GIF是否已设置动画。由于它知道它无法重新编码动画GIF,因此它会尝试存储GIF的原始编码。但是之后它已经读取了流并解码了GIF。因此,当它尝试回放流时,这会失败并且最终不会存储原始数据。

当您致电Save()时,它首先检查是否存储了原始编码。但由于该操作失败,它会尝试重新编码GIF。由于.NET没有动画GIF的编码器,因此它只对第一帧进行编码。

如果您使用FileStream代替它,则可以使用FileStream

您可以先通过将响应加载到MemoryStream来使代码工作:

// ...
Stream stream = httpWebReponse.GetResponseStream();

MemoryStream memoryStream = new MemoryStream();
stream.CopyTo(memoryStream);
memoryStream.Position = 0;
stream = memoryStream;

Image img = Image.FromStream(stream);
// ...

如果您想查看会发生什么,请启用.NET参考源调试并记下Image.EnsureSave()中发生的情况。您还会注意到Image实现已经将Stream复制到MemoryStream中,因此他们可以通过使用它而不是原始Stream来解决问题。

答案 1 :(得分:2)

GDI +不包含任何动画GIF 编码器(只是解码器)。所以你的 img.Save 会丢弃动画。但你可以试试这个:http://www.codeproject.com/KB/GDI-plus/NGif.aspx

答案 2 :(得分:0)

正如“ Rasmus Faber”在2012年1月17日20:00引用的一样==>我得到了我的图像滑块编的建议,效果很好。非常感谢。 我的示例代码如下。启用可以同时加载LPG和动画GIF,并且可以删除所有不需要的文件。

Dim t1 As String
t1 = ListBox5.SelectedItem.ToString
Dim mmp As MemoryStream
mmp = New MemoryStream()

Using str As Stream = File.OpenRead(t1)
str.CopyTo(mmp)
End Using
PictureBox8.Image = Image.FromStream(mmp)