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

标签 python python-imaging-library gif

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

我用一个简单的 Image.save() 保存 gif。 ( GIF format ) 命令类似于以下内容:

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

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

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

   原始图像       “加速”图像

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

Original Image  |  Sped Up Image

    65                   32
    1                    2
    90                   45
    1                    2
    75                   37
    1                    2
    80                   40
    1                    2
    4                    2
    1                    2
    114                  56
    1                    2
    35                   17
    1                    2
    100                  50
    1                    2
    1                    2
    1                    2
    20                   10
    1                    2
    250                  125
    1                    2

问题...

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

最佳答案

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

This superuser answer是最初让我理解这个问题的原因。它解释了问题并提供了一些上下文链接,包括指向 Frame Delay Times for Animated Gifs 的链接。 ,它提供了有关这种差异背后的历史的一些额外背景。后一篇文章暗示了这样一个事实:某些浏览器可能会将 1/100 的值解释为 10/100,使其看起来比预期慢得多。

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

关于python - Gif 帧持续时间似乎比预期慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64473278/

相关文章:

python - 如何将 while 循环中的数据放入表中?

python - Django / python : {% syntax not working.

python - 如何在 Python 3.x 中识别和存储格式化文本文件中的变量和数据?

python - 将默认装饰器应用于类的所有方法,并有选择地排除它们

java - 为什么我的 javafx imageview 扭曲了我的 gif 的播放方式

机器人 : GIF animation cycle complete Listener

Python:从图像中删除 Exif 信息

python - 在 Python 中生成图像缩略图的最快方法是什么?

python - 如何在 Pillow Image.quantize 中使用 kmeans 参数?

java - 如何在GIF动画背景上创建隐形按钮?