(Python 3.4, PIL 1.1.7, Подушка 2.5.1)
Я ожидал, что это скопирует оригинальный GIF.
from PIL import Image
im = Image.open(filename)
im.save('temp.gif')
Вместо этого он сохраняет первый кадр как неподвижный.
Что я делаю неправильно?
(Python 3.4, PIL 1.1.7, Подушка 2.5.1)
Я ожидал, что это скопирует оригинальный GIF.
from PIL import Image
im = Image.open(filename)
im.save('temp.gif')
Вместо этого он сохраняет первый кадр как неподвижный.
Что я делаю неправильно?
Используйте скрипт, найденный на подушке Github, здесь.
import ImageSequence
import Image
import gifmaker
sequence = []
im = Image.open(....)
# im is your original image
frames = [frame.copy() for frame in ImageSequence.Iterator(im)]
# write GIF animation
fp = open("out.gif", "wb")
gifmaker.makedelta(fp, frames)
fp.close()
Видно, что в новой версии скрипта gifmaker просто используется метод save со специальными kwargs для GIF.
Как указано в документации (https://pillow.readthedocs.org/en/latest/handbook/image-file-formats.html#saving-sequence):
При вызове save(), если используется многокадровое изображение, по умолчанию будет сохранен только первый кадр. Чтобы сохранить все кадры, параметр save_all должен присутствовать и иметь значение True.
Если присутствует, параметр цикла может использоваться для установки количества циклов, которые должен выполнять GIF, а параметр длительности может устанавливать количество миллисекунд между каждым кадром.
Версия, которая требует только подушки и работает:
from PIL import Image
width = 300
height = 300
im1 = Image.new("RGBA", (width, height), (255, 0, 0))
im2 = Image.new("RGBA", (width, height), (255, 255, 0))
im3 = Image.new("RGBA", (width, height), (255, 255, 255))
im1.save("out.gif", save_all=True, append_images=[im2, im3], duration=100, loop=0)
используя существующие изображения:
from PIL import Image
im1 = Image.open('a.png')
im2 = Image.open('b.png')
im3 = Image.open('c.png')
im1.save("out.gif", save_all=True, append_images=[im2, im3], duration=100, loop=0)
И, поскольку слишком низкие версии подушек молча терпят неудачу, вот как бонусная версия с проверкой версии библиотеки:
from packaging import version
from PIL import Image
im1 = Image.open('a.png')
im2 = Image.open('b.png')
im3 = Image.open('c.png')
if version.parse(Image.PILLOW_VERSION) < version.parse("3.4"):
print("Pillow in version not supporting making animated gifs")
print("you need to upgrade library version")
print("see release notes in")
print("https://pillow.readthedocs.io/en/latest/releasenotes/3.4.0.html#append-images-to-gif")
else:
im1.save("out.gif", save_all=True, append_images=[
im2, im3], duration=100, loop=0)