I'm trying to generate an animated GIF using images2gif.py (pastebin to the most recent verson : bit.ly/XMMn5h ).
I'm using this Python script:
__author__ = 'Robert'
from images2gif import writeGif
from PIL import Image
import os
file_names = sorted((fn for fn in os.listdir('.') if fn.endswith('.gif')))
#['animationframa.png', 'animationframb.png', ...] "
images = [Image.open(fn) for fn in file_names]
size = (150,150)
for im in images:
im.thumbnail(size, Image.ANTIALIAS)
print writeGif.__doc__
filename = "my_gif.GIF"
writeGif(filename, images, duration=0.2)
However, I am getting the following error:
File "C:\Python27\lib\images2gif.py" , line 418, in writeGifToFile
globalPalette = palettes[ occur.index(max(occur)) ] ValueError: max()
arg is an empty sequence
It seems to me that occur is empty. What is wrong, and is there a better way?
OK I have tested your exact code on two different machines, and it works perfectly on both. One machine is Ubuntu 12.04 and the other is running Windows XP. They are both using Python 2.7, and the latest version of images2gif which I downloaded from here. I recommend the following:
Python, Create a .gif from an numpy ndarray of numpy ndarrays representing images :
import os
import numpy as np
from moviepy.editor import ImageSequenceClip
#Installation instructions:
# pip install numpy
# pip install moviepy
# Moviepy needs ffmpeg tools on your system
# (I got mine with opencv2 installed with ffmpeg support)
def create_gif(filename, array, fps=10, scale=1.0):
"""creates a gif given a stack of ndarray using moviepy
Parameters
----------
filename : string
The filename of the gif to write to
array : array_like
A numpy array that contains a sequence of images
fps : int
frames per second (default: 10)
scale : float
how much to rescale each image by (default: 1.0)
"""
fname, _ = os.path.splitext(filename) #split the extension by last period
filename = fname + '.gif' #ensure the .gif extension
if array.ndim == 3: #If number of dimensions are 3,
array = array[..., np.newaxis] * np.ones(3) #copy into the color
#dimension if images are
#black and white
clip = ImageSequenceClip(list(array), fps=fps).resize(scale)
clip.write_gif(filename, fps=fps)
return clip
randomimage = np.random.randn(100, 64, 64)
create_gif('test.gif', randomimage) #example 1
myimage = np.ones(shape=(300, 200))
myimage[:] = 25
myimage2 = np.ones(shape=(300, 200))
myimage2[:] = 85
arrayOfNdarray = np.array([myimage, myimage2])
create_gif(filename="grey_then_black.gif", #example 2
array=arrayOfNdarray,
fps=5,
scale=1.3)
Prints:
[MoviePy] Building file test.gif with imageio
100%|██████████████████████████████████████████| 100/100 [00:00<00:00, 905.27it/s]
[MoviePy] Building file grey_then_black.gif with imageio
67%|█████████████████████████▎ | 2/3 [00:00<00:00, 65.65it/s]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With