Получить кадры в секунду GIF в Python? - PullRequest
0 голосов
/ 18 ноября 2018

В Python, я загружаю в GIF с PIL. Я извлекаю первый кадр, изменяю его и помещаю обратно. Я сохраняю измененный gif со следующим кодом

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

Где imgs - это массив изображений, который составляет gif, а длительность - это задержка между кадрами в миллисекундах. Я хотел бы сделать значение длительности таким же, как у исходного gif, но я не уверен, как извлечь общую длительность gif или количество отображаемых кадров в секунду.

Насколько я знаю, заголовочный файл gifs не предоставляет никакой информации fps.

Кто-нибудь знает, как я могу получить правильное значение для продолжительности?

Заранее спасибо

Редактировать: пример gif по запросу:

enter image description here

Получено из здесь .

1 Ответ

0 голосов
/ 19 ноября 2018

В файлах GIF каждый кадр имеет свою продолжительность.Таким образом, нет общего fps для файла GIF. PIL поддерживает это , предоставляя диктовку info, которая дает duration текущего кадра.Вы можете использовать seek и tell для перебора кадров и вычисления общей продолжительности.

Вот пример программы, которая вычисляет среднее количество кадров в секунду для файла 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'])
...