Python, как я могу получить GIF-кадры - PullRequest
4 голосов
/ 21 сентября 2011

Я ищу какой-то способ получения числа GIF-кадров. Я смотрю на Google, StackOverflow и любые другие сайты, и я нахожу только мусор! Кто-то знает, как это сделать? мне нужно только простое количество GIF-кадров.

Ответы [ 2 ]

15 голосов
/ 22 сентября 2011

Просто проанализируйте файл, GIF-файлы довольно просты:

class GIFError(Exception): pass

def get_gif_num_frames(filename):
    frames = 0
    with open(filename, 'rb') as f:
        if f.read(6) not in ('GIF87a', 'GIF89a'):
            raise GIFError('not a valid GIF file')
        f.seek(4, 1)
        def skip_color_table(flags):
            if flags & 0x80: f.seek(3 << ((flags & 7) + 1), 1)
        flags = ord(f.read(1))
        f.seek(2, 1)
        skip_color_table(flags)
        while True:
            block = f.read(1)
            if block == ';': break
            if block == '!': f.seek(1, 1)
            elif block == ',':
                frames += 1
                f.seek(8, 1)
                skip_color_table(ord(f.read(1)))
                f.seek(1, 1)
            else: raise GIFError('unknown block type')
            while True:
                l = ord(f.read(1))
                if not l: break
                f.seek(l, 1)
    return frames
12 голосов
/ 21 сентября 2011

Какой метод вы используете для загрузки / управления кадром? Вы используете PIL? Если нет, я предлагаю проверить это: Библиотека изображений Python и, в частности, Страница PIL GIF .

Теперь, при условии, что вы используете PIL для чтения в gif, довольно просто определить, на какой кадр вы смотрите. seek перейдет к определенному кадру, а скажет вернет, какой кадр вы просматриваете.

from PIL import Image
im = Image.open("animation.gif")

# To iterate through the entire gif
try:
    while 1:
        im.seek(im.tell()+1)
        # do something to im
except EOFError:
    pass # end of sequence

В противном случае, я считаю, что вы можете найти количество кадров в gif только при поиске, пока не будет сгенерировано исключение (EOFError).

...