在Pillow中保存动画GIF

lee*_*ewz 7 python pillow

(Python 3.4,PIL 1.1.7,Pillow 2.5.1)

我希望这能复制原始的GIF.

from PIL import Image
im = Image.open(filename)
im.save('temp.gif')
Run Code Online (Sandbox Code Playgroud)

相反,它将第一帧保存为静止.

我究竟做错了什么?

小智 9

可以看到新版本的gifmaker脚本只使用带有特殊kwargs的保存方法用于GIF.

正如文档所述(https://pillow.readthedocs.org/en/latest/handbook/image-file-formats.html#saving-sequences):

调用save()时,如果使用多帧图像,默认情况下只保存第一帧.要保存所有帧,save_all参数必须存在并设置为True.

如果存在,则loop参数可用于设置GIF应循环的次数,duration参数可设置每帧之间的毫秒数.

  • 实际上现在它确实:https://pillow.readthedocs.io/en/latest/releasenotes/3.4.0.html#append-images-to-gif (7认同)

Mat*_*zny 7

仅需要枕头即可工作的版本:

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)
Run Code Online (Sandbox Code Playgroud)

使用现有图像:

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)
Run Code Online (Sandbox Code Playgroud)

而且,由于枕头的版本太低,在这里默默地失败了,这是带有库版本检查的奖励版本:

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)
Run Code Online (Sandbox Code Playgroud)


bla*_*kev 6

使用Pillow 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()
Run Code Online (Sandbox Code Playgroud)

  • 这适用于枕头3吗?你链接到的模块`gifmaker.py`没有定义`makedelta`. (8认同)