Oli*_*rdt 13 c# animation gif stream
我有一个小问题,我找不到任何解决方案.我想将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);
Run Code Online (Sandbox Code Playgroud)
我也尝试过不使用RawFormat System.Drawing.Imaging.ImageFormat.Gif.没改变一件事.frames1是正确的帧数.frames2是1.
PictureBox我的GUI中有2个元素.一个展示img和另一个img2.但是img2不是动画img.怎么了?
我也尝试使用序列化来创建我的byte [].
我将图像序列化并再次反序列化,它也没有改变任何东西.这怎么可能?
从a加载图像时Stream,.NET框架会检测到GIF是否已设置动画.由于它知道它无法重新编码动画GIF,因此它会尝试存储GIF的原始编码.但是在读取流并解码GIF 之后会发生这种情况.因此,当它试图倒回流时,这会失败并且最终不会存储原始数据.
当你调用Save()它时,首先检查它是否存储了原始编码.但由于该操作失败,它会尝试重新编码GIF.由于.NET没有动画GIF的编码器,因此它只对第一帧进行编码.
如果你使用它FileStream而不是它有效,因为a FileStream是可寻找的.
您可以通过首先将响应加载到MemoryStream中来使代码工作:
// ...
Stream stream = httpWebReponse.GetResponseStream();
MemoryStream memoryStream = new MemoryStream();
stream.CopyTo(memoryStream);
memoryStream.Position = 0;
stream = memoryStream;
Image img = Image.FromStream(stream);
// ...
Run Code Online (Sandbox Code Playgroud)
如果要查看发生的情况,请启用.NET参考源调试并记下Image.EnsureSave()中发生的情况.您还将注意到Image实现已经将Stream复制到MemoryStream中,因此他们可以通过使用它而不是原始Stream来解决问题.