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

我有一个小问题,我找不到任何解决方案。 我想将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 。 但是当imgimg2不是动画。 怎么了?

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

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

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来解决问题。

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