最快的GIF并不存在

2022-02-20 23:30:44

2022年2月19日*新的你';You’为了喜剧目的,我们试图制作一个剧烈摇晃的GIF(https://knowyourmeme.com/memes/vibrating-gifs).GIF编辑器';re using允许您设置帧持续时间/延迟,因此您可以将其设置为可能的最低值,以获得最大抖动。但当你查看生成的GIF时,它是';它的演奏速度比预期的慢得多,而且肯定有一些GIF演奏得比这个快。什么';怎么了?

如果你';如果你在这里是因为你想修复你的GIF并且想要快速的答案,解决方案是:将你的帧延迟设置为20毫秒而不是10毫秒。如果你想了解更多关于GIF的知识,为什么会发生这种边缘情况,以及如何改进的一些想法,请继续阅读!

(免责声明:如果你来自一个遥远的乌托邦未来,在那里这不再是一个问题,本文中的一些示例GIF就没有多大意义。否则,我表示哀悼,请忽略此消息。)

我们赢了';I don’我不会详细介绍GIF文件的结构。要了解构成GIF的字节的详细信息,请查看Matthew Flickinger';s";什么';GIF";项目

在GIF格式(87a)的第一个版本中,多个图像帧(大小和位置不同)将相互叠加,以创建一个单一的结果图像。每个帧可以参考不同的256色调色板,因此可以使用超过256种不同的颜色创建图像。

在当前版本的GIF格式(89a)中,可以使用透明度和动画功能。现在,在每个图像帧之前,有一个可选的";延误";可以设置一个值,该值决定在进入下一帧之前,该帧应显示多长时间。具体来说,它';s是在继续下一帧之前要等待的百分之一秒数。该值可以设置为0(无延迟)到0xffff(大约10分钟延迟)。

延迟值0是什么样子?规格没有';我不能直接回答这个问题,但提到了两件事:

在解码GIF文件时,每个图像帧都应该经过处理";除控制信息";中规定的延迟外,无其他延迟;。

我认为这意味着任何延迟为0的图像帧都应该与之前的图像帧数据相结合,就像最初的87a GIF格式一样。如果GIF中的每个图像帧都有0的延迟,那么结果将是一个包含所有图像帧的组合数据的静态图像。

这里';下面是几个例子,说明如果遵循规范,GIF会是什么样子:

(如果你在这里看到相同的图片,请告诉我!这意味着有一款浏览器处理GIF的方式与大型浏览器不同。)

问题是,没有人支持0延迟。也就是说,没有一个项目是你';d通常使用支持它(Firefox、Edge、IE、Chrome、Windows资源管理器、Electron应用程序、Qt应用程序等)查看GIF。延迟小于2(20毫秒)的任何东西都将被钳制为更高的值。通过查看各种节目';源代码,我们可以建立一个为什么的图片。

Qt这样做是为了匹配IE和Firefox的行为(并避免CPU过载)

Firefox这样做是为了匹配IE和Opera的行为(并支持不符合规范的GIF,避免CPU过载)

IE 5之所以这么做,是因为网景的速度很慢(这导致很多人制作格式不好的GIF)

所有这些代码库的一个奇怪之处是:它们不是将0或1的值钳制到2,而是一直被推到10(100ms)。因此';这是一个最佳点——将延迟设置得太小,你';我会得到一个慢GIF。把延迟时间调高一点,你';我会得到更快的GIF。

如果GIF解码不正确,您';重读这篇文章,上面的GIF赢得了';t按速度顺序出现。

你';我需要启用Javascript才能看到这一部分抱歉!那里';这是一个滑块,可以让你看到更改GIF文件中的延迟将如何影响最终结果。它';很酷。

拖动滑块以更改GIF';s延迟值。请注意,小延迟值如何产生令人惊讶的结果。

将10ms这样的值推回到100ms,似乎是因为需要模仿网景的缓慢。Qt和Firefox源代码注释都希望减少CPU使用,但由于支持20ms的值,我认为他们应该将该值限制为20ms。或者,唐';不要完全钳制价值观!现代浏览器已经可以渲染20毫秒的GIF帧,而我';我不确定";电脑太慢了";30年后,这场争论仍然成立。

除此之外,也不要使用0延迟帧。将它们与先前的帧内容结合起来,就像最初的GIF规范所说的那样。如果所有帧都有0延迟,则显示合并所有帧后的静态图像。

我的用例是想在一帧中更新一个大GIF中两个非常小但独立的区域,以减少文件大小。目前,您需要找到覆盖该帧屏幕上所有更改的矩形区域,并将其添加到GIF中,但如果您可以定义多个帧,并将除一帧外的所有帧设置为0延迟,则可以创建相同的效果,但图像数据较少:

进行任何更改的一个缺点是格式不好的GIF赢得了';我不再渲染了。我觉得大胆一点,比如Netscape 2.0的发布:

"Netscape现在符合GIF标准:一些GIF创建实用程序生成的GIF图像不符合标准。这样的图像将显示空轮廓来代替图像。这些轮廓比实际图像大得多。这些图像将完全不可见。要修复这些GIF图像,内容提供商可以将有问题的GIF图像读入另一个符合GIF89a规范的GIF实用程序,然后再次保存图像"

我想看看Netscape 2.0渲染GIF时的样子。这里';这是从上面呈现的红方块测试GIF(正确!)在Windows 95上的Netscape 2.0中:

既然我们有网景,为什么不';我们来看看一个1延迟文件实际上是什么样子吗?这里';s以延迟=2(20ms)运行的GIF,用于比较。结果是';但这并不像预期的那样。除非你';重新主动移动鼠标(原因在堆栈溢出页面中讨论):

这是在激动人心的10毫秒展示前延迟0秒,以获得戏剧性的效果。看看速度!我猜最初的网景没有';t治疗";all-0-延迟和#34;GIF作为单个静态帧,正如规范可能建议的那样。为什么鼠标移动不是';我不需要加速这个案子,我不知道:

呵呵。缓慢,然后崩溃。我猜这是在我们有144Hz监视器每秒渲染那么多帧之前。因此,即使是Netscape 2.0也没有';t显示GIF的速度如此之快……这是否意味着10毫秒GIF在历史上从未出现过?Netscape崩溃是一个不祥的迹象——谁知道如果有人试图看到最快的GIF会发生什么。也许我们不应该';毕竟,我们不能更新浏览器😅

没有人会按照规范来呈现GIF,但他们应该(IMO)。现在,将GIF延迟设置为2(20ms)而不是1(10ms),以获得运行最快的GIF。如果每个人都更新了符合规范的代码,我们会得到以下好处:

如果您有任何意见或反馈,请随时讨论Reddit:Reddit讨论。

这里';s Internet Explorer 5未能正确呈现红色方块测试GIF。这表明程序开始违反规范的时间有多早:

这里';的Windows XP图片查看器,完全无法生成彩色GIF。。。除了缩略图视图中的: