Saving an animated GIF in Pillow

Question:

(Python 3.4, PIL 1.1.7, Pillow 2.5.1)

I expected this to copy the original 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?

Asked By: leewz

||

Answers:

Use the script found on the Pillow Github, here.

 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()
Answered By: blakev

One can see that the new version of gifmaker script simply uses save method with special kwargs for GIF.

As the documentation states (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. To save all frames, the save_all parameter must be present and set to 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.

Answered By: mr. Y

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)
Answered By: reducing activity

I just encountered same problem. I solved it by making save_all=True. So you don’t need to use gifmaker library anymore.

Answered By: mohammadreza naderi
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.