Gif 帧持续时间似乎比预期慢

jra*_*amm 2 python gif python-imaging-library

我正在使用枕头图像库创建 GIF。我遇到了一个问题,我试图使某些帧以尽可能短的帧持续时间快速闪烁,但是当我将帧的持续时间设置为 1(可能的最低持续时间,GIF 的持续时间为 100) ),实际上它的持续时间似乎比预期的要长。

\n

我使用类似于以下的简单Image.save()GIF 格式)命令保存 gif :

\n
# durations are actually in milliseconds in the pillow library, but\n# they translate to 100ths of a second (1/10 of the value input here)\ndurations = [650, 10, 900, 750, 10, 800, 10, ... ]\nmy_gif.save(filename, format=\'GIF\', save_all=True, duration=durations, loop=0, disposal=2)\n
Run Code Online (Sandbox Code Playgroud)\n

我不确定这个问题是特定于枕头库还是仅特定于 GIF 格式。但我注意到以下几点:

\n
    \n
  • gif 视觉上看起来比预期慢
  • \n
  • 当我将生成的 GIF 加载到 GIF 编辑工具(例如 EZGif.com)中时,它报告帧持续时间符合预期 - “闪烁帧”的持续时间为 1,这是我保存文件时使用的帧持续时间。
  • \n
  • 当我使用 EZGif加速GIF 时,奇怪的是,EZGif 生成的 GIF 的“加速”版本使用帧持续时间 2 而不是 1 作为闪烁帧,但它看起来在视觉上播放得更快,更接近我真正想要发生的事情。
  • \n
\n

   原始图像“加速”图像

\n

\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0

\n

加载到 EZGif 时报告的每帧持续时间

\n
Original Image  |  Sped Up Image\n\n    65                   32\n    1                    2\n    90                   45\n    1                    2\n    75                   37\n    1                    2\n    80                   40\n    1                    2\n    4                    2\n    1                    2\n    114                  56\n    1                    2\n    35                   17\n    1                    2\n    100                  50\n    1                    2\n    1                    2\n    1                    2\n    20                   10\n    1                    2\n    250                  125\n    1                    2\n
Run Code Online (Sandbox Code Playgroud)\n

问题...

\n

有人可以帮助解释这种看似差异的原因吗?这是GIF格式的工作原理,还是枕头图像库的问题?如何生成具有更快“闪烁”效果的 GIF,就像我希望的那样?

\n

jra*_*amm 5

经过进一步研究,这似乎是跨不同浏览器和平台进行 gif 渲染的一个已知问题。虽然 GIF 规范表明 GIF 支持高达 100fps,但实际上,大多数现代浏览器仅支持最大 50fps,如Buttery Smooth 10fps中所述

这个超级用户的答案最初让我理解了这个问题。它解释了问题并提供了一些上下文链接,包括指向动画 Gif 的帧延迟时间的链接,它提供了有关这种差异背后的历史的一些附加上下文。后一篇文章暗示了这样一个事实:某些浏览器可能会将 1/100 的值解释为 10/100,使其看起来比预期慢得多。

有趣的是,我发现将 gif 帧延迟设置为 2/100(而不是 1/100)会导致在我测试过的现代浏览器中帧播放速度更快,这似乎是它们的最大速度(50fps)支持。我怀疑 EZGif 已经知道这一点,并在他们的算法中考虑到了这一点。

  • 我是 ezgif 的所有者,你说得完全正确:) 虽然 GIF 格式在技术上确实允许将延迟时间设置为“1”,但大多数浏览器会忽略此值并默认速度较慢,因此通常使用它是一个好主意至少“2”。 (2认同)