为什么我创建的gif这么慢?


33

我正在使用ImageMagick将png的集合变成单个gif。我希望此gif尽快循环播放。

这大约是我期望的输出(由Wikipedia提供):

预期产量

这是我实际得到的输出:

实际产量

在我的浏览器(Firefox 17)上,预期gif的运行速度是实际gif的两倍以上。这让我感到惊讶,因为我指定每个帧应具有0个延迟。

首先,我通过分解从维基百科借来的gif来创建36 png:

--caution: command generates 36 pngs
convert.exe newton.gif newton_%d.png

然后我习惯coalesce将png重组为一个gif。

convert.exe -dispose none -delay 0 newton_%d.png[0-35] -coalesce output.gif

identify 确认每个帧没有延迟:

identify.exe -format "%T, " output.gif
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

实际上,这比原始延迟少:

identify.exe -format "%T, " newton.gif
5, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2,

实际gif的延迟少于预期的gif。那么,为什么预期的gif是实际gif的两倍?


1
出于好奇,如果将延迟设置为1而不是0,会发生什么?
mgilson

1
看起来像是帧速率问题。
SnakeDoc 2013年

@mgilson,我刚刚尝试过。0延迟图像和1延迟图像似乎已完美同步。这很奇怪,因为1个延迟的图像应该在每个循环中落后于36/100秒。
凯文

1
tl; dr关于这个问题:使用-delay 2
Matt M.

Answers:


17

我进行了实验并创建了10ms(延迟= 1)版本。

10ms延迟示例

似乎呈现gif的程序往往不遵守百分之一秒的延迟率。而是,它们使用的值比您选择的小值大得多。

我不能真正评论他们这样做的原因。我遇到的原因不止一个,所有的猜测都有可能。

通常,我建议您在所有情况下都至少使用200秒的延迟。

消息来源(表明这样做的原因似乎有多种。其中一些原因相对较旧):


1
如果渲染程序降低了所有太快的gif的速度,那么Wikipedia的gif就会和我自己的gif一样慢。但事实并非如此。为什么维基百科可以打破速度限制,而我却不能呢?
凯文

2
@Kevin:它会减慢所有过快的GIF。您的GIF太快了。维基百科的GIF不太快。您需要放慢速度,以免过快。
David Schwartz 2013年

Wikipedia gif的帧延迟范围在20毫秒到50毫秒之间。如果我将自己的帧延迟设置为20 ms,尽管理论上它满足与Wikipedia gif相同的“不太快”标准,但它仍然较慢。
凯文

2
如果除了具有20ms延迟的Wikipedia图像之外,还包括您创建的具有20ms延迟的gif,我将进行一下研究。
David Mah

2
我错了。我创建的20 ms gif确实与Wikipedia gif一样快。
凯文

18

看起来@DavidMah是正确的。在我的Linux系统上,最小延迟为0.5:

convert -dispose none -delay 0.4 newton_%d.png[0-35] -coalesce output0.4.gif

在此处输入图片说明

convert -dispose none -delay 0.5 newton_%d.png[0-35] -coalesce output0.5.gif

在此处输入图片说明

convert -dispose none -delay 1 newton_%d.png[0-35] -coalesce output1.gif

在此处输入图片说明

由于某些原因,图像似乎无法在我的浏览器中正确显示。使用本地图像查看器(eom),第一个图像的速度与原始问题中的一个图像一样慢,而其他两个图像的速度都比Wikipedia的要快。无论如何,如果我的浏览器存在特定问题,我都会进行发布。无论如何,如果尝试上面发布的命令,则应该会获得更快的速度。


更新:似乎有两个问题。浏览器(至少在Linux上运行y firefox和Chrome)不能显示延迟小于1.5创建的gif。1.5正常,1.4慢。我的图像查看器可以处理0.5或更高的延迟。尝试下载上述图像之一,然后在您喜欢的图像查看器中将其打开。另外,看看这些:

convert -dispose none -delay 1.4 newton_%d.png[0-35] -coalesce output1.4.gif

在此处输入图片说明

convert -dispose none -delay 1.5 newton_%d.png[0-35] -coalesce output1.5.gif

在此处输入图片说明

UPDATE2:@DavidMah在下面的注释中指出,十进制值四舍五入为最接近的整数。因此,将1.4舍入到1太慢,而将1.5舍入到2则可以。


7
当心尝试将延迟分配给十进制值。延迟存储在两个字节中(这意味着最大的帧延迟为655360ms),并且是无符号整数。“转换”会将您的值舍入为最接近的整数。en.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_GIF
David Mah

3
@DavidMah啊,这很有道理。所以1.5的作品,因为,因为它是四舍五入到1。这是四舍五入为2,而1.4没有
terdon

6

我使用XxY延迟符号获得了更大的成功,从本质上讲,x它就像一个/,因此,如果您指定-delay 1x20,则该帧将显示1/20秒。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.