Гифы, открытые с помощью python, имеют разбитые кадры

Иногда при открытии gif и сохранении отдельных кадров в файлах фреймы выходят в плохом состоянии. Это не происходит со всеми gif, но с теми, что происходит со многими кадрами.

пример

Вот оригинал gif

http://imgur.com/XMxW3m3

Вот первый кадр (выходит хорошо)

http://imgur.com/xv43alb

Вот второй кадр (выходит завинчивается)

http://imgur.com/hG4VxzL

Я пробовал то же самое с двумя различными модулями python. Первый PIL

from PIL import Image img = Image.open('pigs.gif') counter = 0 collection = [] while True: try: img.save('original%d.gif' % counter) img.seek(img.tell()+1) counter += 1 except EOFError: break 

Тогда Wand:

 from wand.image import Image img = Image(filename='pigs.gif') for i in range(len(img.sequence)): img2 = Image(img.sequence[i]) img2.save(filename='original%d.gif' % i) 

и то же самое происходит с обоими модулями.

Что происходит?

PS: Я нашел других людей, имеющих те же симптомы. Однако эти решения (оба из которых вращаются вокруг ошибки PIL, которая удаляет палитру, когда вы делаете .seek ()), не решила мою проблему: Python: преобразование кадров GIF в PNG и PIL – преобразование GIF-фреймов в JPG

One Solution collect form web for “Гифы, открытые с помощью python, имеют разбитые кадры”

В gif кадр может содержать только пиксели, которые были изменены в этом фрейме. Поэтому, когда вы экспортируете, вы получаете черный цвет, где не было никаких изменений.

 from PIL import Image img = Image.open('pigs.gif') counter = 0 collection = [] current = img.convert('RGBA') while True: try: current.save('original%d.png' % counter) img.seek(img.tell()+1) current = Image.alpha_composite(current, img.convert('RGBA')) counter += 1 except EOFError: break 

EDIT: Изменен формат вывода на png, как предлагается в комментариях из-за проблем с цветовой палитрой, которые в противном случае возникают.

  • Определение прозрачности GIF в Python
  • Создание анимированного GIF в Python
  • Python ImageIO Gif устанавливает задержку между кадрами
  • PIL - конвертировать GIF-фреймы в JPG
  • Python - лучший язык программирования в мире.