【问题标题】:Saving an animated GIF in Pillow在 Pillow 中保存动画 GIF
【发布时间】:2014-09-01 13:14:58
【问题描述】:

(Python 3.4,PIL 1.1.7,枕头 2.5.1)

我希望这会复制原始 GIF。

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

相反,它将第一帧保存为静止图像。

我做错了什么?

【问题讨论】:

  • 我刚刚在这里回答了同样的问题^^:stackoverflow.com/a/24688649/1144523。基本上,Image 让您一次处理一张图片。
  • 嗯,这很不幸。 Python 似乎没有真正的 GIF 模块。
  • 由于它不是完全重复的,我很犹豫是否将其作为重复关闭。你能把你的最后一句话作为答案吗?
  • machow的问题是关于阅读GIF,而不是写GIF。
  • @Damian,它回答了“为什么这不起作用?”的问题。此外,machow 在该问题的答案中的最后一句话与保存 GIF 的答案相关联。

标签: python pillow


【解决方案1】:

只需要枕头和作品的版本:

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)

【讨论】:

    【解决方案2】:

    可以看出,新版本的 gifmaker 脚本只是简单地使用了带有特殊 kwargs 的保存方法。

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

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

    如果存在,loop参数可以用来设置GIF应该循环的次数,duration参数可以设置每帧之间的毫秒数。

    【讨论】:

    • 但我在文档中找不到有关如何从头开始而不是从另一个 GIF 创建多帧图像的任何内容。
    • 是的,这是个问题。 Pillow 似乎没有提供任何接口来做到这一点。
    【解决方案3】:

    使用 Pillow Github 上的脚本,here。

     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()
    

    【讨论】:

    • 这适用于 Pillow 3 吗?您链接到的模块 gifmaker.py 未定义 makedelta。
    • 我将前两个导入修复为 from PIL import ImageSequence 和 from PIL import Image,但是 gifmaker 应该怎么做?
    • 好像被删除了。
    猜你喜欢
    • 2018-12-04
    • 2015-01-30
    • 2014-09-28
    • 2018-12-31
    • 2020-02-27
    • 1970-01-01
    • 2021-06-24
    • 2019-08-11
    • 2011-11-01
    相关资源
    最近更新 更多