web-dev-qa-db-ja.com

アニメーションGIFを枕に保存する

(Python 3.4、PIL 1.1.7、Pillow 2.5.1)

これで元のGIFがコピーされると思っていました。

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

代わりに、最初のフレームを静止画として保存します。

私は何が間違っているのですか?

7
leewz

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

新しいバージョンのgifmakerスクリプトは、GIF用の特別なkwargsを使用したsaveメソッドを使用していることがわかります。

ドキュメントに記載されているように( https://pillow.readthedocs.org/en/latest/handbook/image-file-formats.html#saving-sequences ):

Save()を呼び出すときに、マルチフレームイメージが使用されている場合、デフォルトでは最初のフレームのみが保存されます。すべてのフレームを保存するには、save_allパラメーターが存在し、Trueに設定されている必要があります。

存在する場合、loopパラメーターを使用してGIFがループする回数を設定でき、durationパラメーターを使用して各フレーム間のミリ秒数を設定できます。

9
mr. Y

枕だけを必要とし、機能するバージョン:

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