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