【问题标题】:How to disable a looping for gif image and save it in c#如何禁用 gif 图像的循环并将其保存在 c# 中
【发布时间】:2018-03-08 18:32:34
【问题描述】:

在我的应用程序中,有一个图像上传,如果用户想要上传 gif 图像。我需要禁用图像循环并保存它,结果用户的 gif 图像必须播放一次然后停止。也许我需要从 gif 图像的最后一帧中删除指针?有什么想法吗?

【问题讨论】:

  • “我需要在图像中禁用循环并保存它” - 表示您要保存某个帧?
  • @Sinatr 不,gif 图像它是另一个站点上的广告横幅的一部分,并且该站点的要求之一是没有无限循环的 gif。
  • @Sinatr 你的意思是,他应该将单个帧保存为另一个图像并在循环完成后在客户端上替换它?
  • 其实不是,gif图像是由帧组成的图像,每一帧都有一个指向下一帧的指针,所以我需要从最后一帧中删除指针并保存它。我需要修改 gif 并保存。恕我直言
  • @PavelKononenko - 您需要删除 Netscape 循环扩展块。 vurdalakov.net/misc/gif/netscape-looping-application-extension

标签: c# image gif system.drawing


【解决方案1】:

我找到了答案,谢谢所有试图帮助我的人。

gif 图像有一组属性,如果您知道每个属性的一个字节的具体地址,就可以获得这些属性。 例如,20737 是循环属性。 如果此属性设置为 0 gif 图像将无限循环,但如果将此属性设置为大于 0,则 gif 图像将无限重复。我放在这里的example

var image = System.Drawing.Image.FromFile(path)
var IsLooped = BitConverter.ToInt16(image.GetPropertyItem(20737).Value, 0) != 1;

【讨论】:

  • 您也应该注意这一点:- bugzilla.mozilla.org/show_bug.cgi?id=1255497#c4
  • 这是正确的,不是吗? “NETSCAPE2.0”中的值 0 表示永远循环。缺少“NETSCAPE2.0”块意味着 0 次重复 = 循环一次。 “NETSCAPE2.0”中的值 1 表示 1 次重复 = 2 次循环。 “NETSCAPE2.0”中的值 2 表示 2 次重复 = 3 次循环。
  • 嗨 Pavel,刚刚检查了一张图片。正如评论中提到的那样。运行这个:gifsicle --no-loopcount < input.gif > output.gif,它将删除 Netscape 扩展块,并且图像不会在 chrome 和 firefox 中循环。使用xxd output.gif | grep NETSCAPE 确认并删除了 Netscape 扩展块。在ubuntu上完成。希望能帮助到你。 Gifsicle 参考 - lcdf.org/gifsicle/man.html
  • 顺便说一句,我不确定如何在 C# 中执行,但最好检查 NETSCAPE 块的签名并从文件流中删除 19 个字节并保存回以阻止 gif 循环.
【解决方案2】:

您需要添加或更改 Netscape 应用程序扩展块。在此块中有 2 个字节来控制循环,请参阅以下答案中的详细信息:

https://stackoverflow.com/a/28486261/3936440

我找不到合适的 GIF 操作包,但我认为您可以使用 BumpKit 作为此处提到的灵感

https://stackoverflow.com/a/32810041/3936440

https://github.com/DataDink/Bumpkit/blob/master/BumpKit/BumpKit/GifEncoder.cs

【讨论】:

    猜你喜欢
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多