我正在尝试将两个不同的 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.Bitmap
和 System.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/