在python中获取gif的每秒帧数?

Posted

技术标签:

【中文标题】在python中获取gif的每秒帧数?【英文标题】:Get frames per second of a gif in python? 【发布时间】:2019-04-21 05:32:10 【问题描述】:

在 python 中,我使用 PIL 加载 gif。我提取第一帧,修改它,然后放回去。我用以下代码保存修改后的 gif

imgs[0].save('C:\\etc\\test.gif',
           save_all=True,
           append_images=imgs[1:],
           duration=10,
           loop=0)

其中 imgs 是组成 gif 的图像数组,duration 是帧之间的延迟(以毫秒为单位)。我想让持续时间值与原始 gif 相同,但我不确定如何提取 gif 的总持续时间或每秒显示的帧数。

据我所知,gifs的头文件没有提供任何fps信息。

有谁知道我怎样才能得到正确的持续时间值?

提前致谢

编辑:请求的 gif 示例:

取自here。

【问题讨论】:

如果您没有找到更好的答案***.com/a/31194595/2836621,您可以使用 ImageMagick 获得以厘秒为单位的帧延迟 GIF 并不表示 fps,因为每个单独的图像都可以有自己的时间。这是一个潜在的问题吗?如果不是,请将它们全部相加并除以帧数。 @usr2564301 这不是问题,因为帧将始终具有相同的持续时间,因此我可以从中计算帧速率,但我不知道如何获得单独的持续时间框架,你呢? 我不知道,但 GIF 格式在其他地方被广泛描述。甚至可能有一些现成的代码。同时,您可以在您的问题中添加这样的 GIF 吗? 我在上面链接的答案中有一个动画 GIF,列出了每帧延迟。 【参考方案1】:

在 GIF 文件中,每一帧都有自己的持续时间。所以GIF文件没有通用的fps。 PIL supports this 的方式是提供一个info dict,它给出当前帧的duration。您可以使用seektell 遍历帧并计算总时长。

这是一个计算 GIF 文件每秒平均帧数的示例程序。

import os
from PIL import Image

FILENAME = os.path.join(os.path.dirname(__file__),
                        'Rotating_earth_(large).gif')

def get_avg_fps(PIL_Image_object):
    """ Returns the average framerate of a PIL Image object """
    PIL_Image_object.seek(0)
    frames = duration = 0
    while True:
        try:
            frames += 1
            duration += PIL_Image_object.info['duration']
            PIL_Image_object.seek(PIL_Image_object.tell() + 1)
        except EOFError:
            return frames / duration * 1000
    return None

def main():
    img_obj = Image.open(FILENAME)
    print(f"Average fps: get_avg_fps(img_obj)")

if __name__ == '__main__':
    main()

如果您假设 duration 对于所有帧都相等,您可以这样做:

print(1000 / Image.open(FILENAME).info['duration'])

【讨论】:

以上是关于在python中获取gif的每秒帧数?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 从 GIF 中提取关键帧

每秒帧数是啥意思

帧数和每秒帧数是一样的吗?

如何在opencv中计算每秒帧数?

如何将运动物理函数缩放到每秒帧数(在游戏引擎中)?

画面每秒传输帧数