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

Kev*_*vin 35 gif imagemagick

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

然后我习惯于coalesce将 png 重新组合成一个 gif。

convert.exe -dispose none -delay 0 newton_%d.png[0-35] -coalesce output.gif
Run Code Online (Sandbox Code Playgroud)

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,
Run Code Online (Sandbox Code Playgroud)

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

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,
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*Mah 18

我试验并创建了 10 毫秒(延迟 = 1)版本。

10ms 延迟示例

似乎呈现 gif 的程序往往不遵守百分之一秒的延迟率。相反,它们使用的值远大于您选择的小值。

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

一般来说,我建议您在所有情况下都使用至少 200 秒的延迟。

来源(证明了这似乎有多种原因。有些相对较旧):

  • @Kevin:它减慢了所有太快的 GIF。你的 GIF 太快了。维基百科的 GIF 并不太快。你需要放慢速度,这样你就不会“太快”了。 (2认同)
  • 如果在具有 20 毫秒延迟的维基百科图像旁边包含您创建的也具有 20 毫秒延迟的 gif,我会看一下。 (2认同)
  • 我错了。我创建的 [20 ms gif](http://imgur.com/re89hNd) 确实与维基百科 gif 一样快。 (2认同)

ter*_*don 18

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

convert -dispose none -delay 0.4 newton_%d.png[0-35] -coalesce output0.4.gif
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

convert -dispose none -delay 0.5 newton_%d.png[0-35] -coalesce output0.5.gif
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

convert -dispose none -delay 1 newton_%d.png[0-35] -coalesce output1.gif
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

出于某种原因,图像似乎无法在我的浏览器中正确显示。使用本地图像查看器 ( eom),第一张图像与原始问题中的图像一样慢,而其他两个图像都比维基百科的快。无论如何,我都会发布,以防这是我的浏览器特有的问题。无论如何,如果您尝试上面发布的命令,您应该会获得更好的速度。


更新:似乎有两个问题。浏览器(至少是在 Linux 上运行的 Firefox 和 Chromium)无法显示延迟 <1.5 的 gif。1.5 工作正常,1.4 很慢。我的图像查看器可以处理 0.5 及以上的延迟。尝试下载上述图像之一并在您最喜欢的图像查看器中打开它。另外,看看这些:

convert -dispose none -delay 1.4 newton_%d.png[0-35] -coalesce output1.4.gif
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

convert -dispose none -delay 1.5 newton_%d.png[0-35] -coalesce output1.5.gif
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

UPDATE2:@DavidMah 在下面的评论中指出十进制值四舍五入为最接近的整数。因此,1.4 舍入为 1,这太慢了,而 1.5 舍入为 2 就可以了。

  • 当心试图将延迟分配给十进制值。延迟存储在两个字节中(这意味着最大的帧延迟是 655360 毫秒)并且是一个无符号整数。Convert 将您的值四舍五入为最接近的整数。http://en.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_GIF (7认同)
  • @DavidMah 啊,这是有道理的。所以 1.5 有效,因为它四舍五入为 2,而 1.4 不起作用,因为它四舍五入为 1。 (3认同)

kra*_*lyk 6

我使用XxY延迟表示法取得了更大的成功,本质x上就像 a /,所以如果您指定-delay 1x20,则帧显示 1/20 秒。