c# - 在C#中,可能是Image.SaveAdd的一个bug,谁能帮我解决一下?

标签 c# image gif

我正在尝试将两个不同的 gif 文件合并为一个文件。

首先,我学到了很多关于 gif 格式的知识。我知道延迟时间值是在 Graphics Control Extension 中设置的,它是一个 gif 文件 block 。

我保存了第一个gif并设置了FrameDelay值,代码如下:

    ImageCodecInfo codeInfo = GetEncoder(ImageFormat.Gif);
    System.Drawing.Imaging.Encoder saveEncoder = System.Drawing.Imaging.Encoder.SaveFlag;
    EncoderParameters parameters = new EncoderParameters(1);

    parameters.Param[0] = new EncoderParameter(saveEncoder, (long)EncoderValue.MultiFrame);
    PropertyItem PropertyTagFrameDelay = img1.GetPropertyItem(0x5100);
    PropertyTagFrameDelay.Value = new byte[] { 0x96, 0x00 };// this is the delay value 0x0096, means 1.5 second
    img1.SetPropertyItem(PropertyTagFrameDelay);

    PropertyItem LoopCount = img1.GetPropertyItem(0x5101);
    LoopCount.Value = new byte[] { 0x00, 0x00 };// this means the gif loops endlessly
    img1.SetPropertyItem(LoopCount);

    img1.Save(@"c:\ddd.gif", codeInfo, parameters);

然后我尝试添加另一张图片作为第二帧。

    parameters = new EncoderParameters(1);
    parameters.Param[0] = new EncoderParameter(saveEncoder, (long)EncoderValue.FrameDimensionTime);
    PropertyTagFrameDelay = img2.GetPropertyItem(0x5100);
    PropertyTagFrameDelay.Value = new byte[] { 0x96, 0x00 };// this is the delay value 0x0096, means 1.5 second
    img2.SetPropertyItem(PropertyTagFrameDelay);

最后,我应该终止这张图片。

parameters = new EncoderParameters(1);
  parameters.Param[0] = new EncoderParameter(saveEncoder, (long)EncoderValue.Flush);
  img1.SaveAdd(parameters);

而且我发现第二帧的延迟时间一直是0。

我尝试了很多方法,但我没有办法将其设置为0x96。

那么它有什么问题呢?

最佳答案

这根本不受任何 .NET 图像编码器的支持。既不是 GDI+ 也不是 WIC,System.Drawing.BitmapSystem.Windows.Media.Imaging.PngBitmapEncoder 类的底层 native 编解码器。

虽然这听起来像是一个非常奇怪的疏忽,但最可能的原因是 GIF 受到软件专利的阻碍。 Unisys 拥有 LZW 压缩算法的权利并开始 aggressively pursuing获得许可费。从可以获得最多资金的最明显目标开始,微软永远位居榜首。他们也不谦虚,一个在网页上使用 GIF 的非商业或私有(private)网站在 1999 年不得不掏出 5000 美元。

这杀死了图像格式。在此之前无处不在,几乎每个人都停止使用它们。速度也快得惊人,这只用了几个月 。顺便说一句,恰逢每个人都完全沉浸在动画 gif 中,这在以前是严重过头了。您可能会在 wayback 机器上找到一些过去的网页,眼角的一切都在移动。这不是唯一的幸运巧合,它是开发开源 PNG 格式的核心原因。感谢我们的幸运星:)

专利于 2004 年左右到期,具体取决于您居住的地方,因此您不必再担心来自 Unisys 的来信。

长话短说,您必须四处寻找另一个库才能将此功能添加到您的程序中。这个existing SO question很好地涵盖了它,这里就不再赘述了。

关于c# - 在C#中,可能是Image.SaveAdd的一个bug,谁能帮我解决一下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17895596/

相关文章:

ios - 使用 FLAnimatedImage 的示例或演示 SWIFT 代码

c# - 取消保存时引发 DocumentBeforeSaveEventHandler 事件

Java - 获取给定源和 mime 类型的图像文件扩展名

c# - 如何将 POCO 对象列表绑定(bind)到 Windows 窗体 DataGrid

javascript - 如何在按下退出键时关闭图像?

python - 如何将图像嵌入到 pandas DataFrame 并在 flask 网页中显示

c++ - 文本框隐藏在gif动画后面

javascript - 在javascript中暂停GIF

c# - SpreadsheetLight 的行数

c# - 通过 Paypal C# Rest API 处理第三方支付