The best answers to the question “Programmatically generate video or animated GIF in Python?” in the category Dev.
I have a series of images that I want to create a video from. Ideally I could specify a frame duration for each frame but a fixed frame rate would be fine too. I’m doing this in wxPython, so I can render to a wxDC or I can save the images to files, like PNG. Is there a Python library that will allow me to create either a video (AVI, MPG, etc) or an animated GIF from these frames?
Edit: I’ve already tried PIL and it doesn’t seem to work. Can someone correct me with this conclusion or suggest another toolkit? This link seems to backup my conclusion regarding PIL: http://www.somethinkodd.com/oddthinking/2005/12/06/python-imaging-library-pil-and-animated-gifs/
Here’s how you do it using only PIL (install with:
pip install Pillow):
import glob from PIL import Image # filepaths fp_in = "/path/to/image_*.png" fp_out = "/path/to/image.gif" # https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#gif img, *imgs = [Image.open(f) for f in sorted(glob.glob(fp_in))] img.save(fp=fp_out, format="GIF", append_images=imgs, save_all=True, duration=200, loop=0)
See docs: https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#gif
I’d recommend not using images2gif from visvis because it has problems with PIL/Pillow and is not actively maintained (I should know, because I am the author).
Instead, please use imageio, which was developed to solve this problem and more, and is intended to stay.
Quick and dirty solution:
import imageio images =  for filename in filenames: images.append(imageio.imread(filename)) imageio.mimsave('/path/to/movie.gif', images)
For longer movies, use the streaming approach:
import imageio with imageio.get_writer('/path/to/movie.gif', mode="I") as writer: for filename in filenames: image = imageio.imread(filename) writer.append_data(image)
As of June 2009 the originally cited blog post has a method to create animated GIFs in the comments. Download the script images2gif.py (formerly images2gif.py, update courtesy of @geographika).
Then, to reverse the frames in a gif, for instance:
#!/usr/bin/env python from PIL import Image, ImageSequence import sys, os filename = sys.argv im = Image.open(filename) original_duration = im.info['duration'] frames = [frame.copy() for frame in ImageSequence.Iterator(im)] frames.reverse() from images2gif import writeGif writeGif("reverse_" + os.path.basename(filename), frames, duration=original_duration/1000.0, dither=0)
Well, now I’m using ImageMagick. I save my frames as PNG files and then invoke ImageMagick’s convert.exe from Python to create an animated GIF. The nice thing about this approach is I can specify a frame duration for each frame individually. Unfortunately this depends on ImageMagick being installed on the machine. They have a Python wrapper but it looks pretty crappy and unsupported. Still open to other suggestions.