简体   繁体   English

在 Pillow 中保存动画 GIF

[英]Saving an animated GIF in Pillow

(Python 3.4, PIL 1.1.7, Pillow 2.5.1) (Python 3.4、PIL 1.1.7、枕头 2.5.1)

I expected this to copy the original GIF.我希望这会复制原始的 GIF。

from PIL import Image
im = Image.open(filename)
im.save('temp.gif')

Instead, it saves the first frame as a still.相反,它将第一帧保存为静止图像。

What am I doing wrong?我究竟做错了什么?

Version that requires only pillow and works:只需要枕头和作品的版本:

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)

using existing images:使用现有图像:

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)

And, as too low versions of pillow are silently failing here is as a bonus version with a library version check:而且,由于太低版本的枕头在这里默默地失败了,这是作为带有库版本检查的奖励版本:

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)

One can see that the new version of gifmaker script simply uses save method with special kwargs for GIF.可以看出,新版本的 gifmaker 脚本只是简单地使用了带有特殊 kwargs 的 GIF 保存方法。

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

When calling save(), if a multiframe image is used, by default only the first frame will be saved.调用 save() 时,如果使用多帧图像,默认情况下只保存第一帧。 To save all frames, the save_all parameter must be present and set to True.要保存所有帧,必须存在 save_all 参数并将其设置为 True。

If present, the loop parameter can be used to set the number of times the GIF should loop, and the duration parameter can set the number of milliseconds between each frame.如果存在,loop参数可以用来设置GIF应该循环的次数,duration参数可以设置每帧之间的毫秒数。

Use the script found on the Pillow Github, here .使用在 Pillow Github 上找到的脚本,请点击此处

 from PIL import ImageSequence
 from PIL 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()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM