gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:10:11 26 4
gpt4 key购买 nike

我有一个小问题,我没有找到任何解决方案。我想将 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[]。

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

最佳答案

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

关于C# gif 图像到 MemoryStream 并返回(丢失动画),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8763630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com