我也面临着同样的问题GIF我前段时间写的编码器/解码器类(并且不时改进)。我昨天就找到了这个问题的解决方案。这GIF完全没问题,问题出在现代互联网浏览器方面。受影响的浏览器有 Opera、IE 和 Chrome(其他浏览器未测试)。
经过对此事的一些调查(通过比较循环和非循环图像),我发现这些浏览器GIF解码器忽略循环参数GIF文件。相反,它们依赖于第一帧中未记录的应用程序扩展GIF file.
因此解决方案是在第一帧图像数据之前添加此扩展命令。添加这个块:
0x21,0xFF,0x0B,"NETSCAPE","2.0",0x03,0x01,0x00,0x00,0x00
这将迫使浏览器无限循环。
这是一个例子:
十六进制视图,以便您了解它是如何添加的:
The GIF对插入/重新排序非图像数据块不敏感,因此您可以在任何其他扩展之间的任何位置的第一个图像之前插入它。我把它直接放在标题+调色板之后。可以用哪个来完成C++或任何其他语言(不需要重新编码)。欲了解更多信息,请参阅:
- 如何找到GIF图像中图像块从哪里开始?
- 解码 GIF87a 光栅数据流的数据字节
[里德·邓克尔编辑]
您也可以使用十六进制编辑器手动完成此操作。我在 macOS Sierra 上使用了“Hex Fiend”。
搜索21 F9
在十六进制的开始部分(这是标题)。在上面的照片中,它是21 F9 04 04 00 00 00 00
。你的可能略有不同,但请注意它出现在前面2C
,它标记图像块的开始。
之前21 F9
... 部分,insert以下十六进制,在上图中标记为“应用程序扩展”:
21 FF 0B 4E 45 54 53 43 41 50 45 32 2E 30 03 01 00 00 00
保存并测试一下。
Spektre 的插件:注意:21 F9
标记 gfx 扩展块,它是可选的,因此它可能不会出现在所有或任何帧中(但现在这种情况确实很少见)。