Search code examples
python-3.xpython-imaging-librarypython-imageio

Change gif characteristics


I have written a python code which creates a gif from a list of images. In order to do this, I used the python library: imageio. Here is my code :

def create_gif(files, gif_path):
"""Creates an animated gif from a list of figures

Args:
    files (list of str) : list of the files that are to be used for the gif creation.
        All files should have the same extension which should be either png or jpg
    gif_path (str) : path where the created gif is to be saved

Raise:
    ValueError: if the files given in argument don't have the proper 
        file extenion (".png" or ".jpeg" for the images in 'files',
        and ".gif" for 'gif_path')
"""
images = []

for image in files:

    # Make sure that the file is a ".png" or a ".jpeg" one
    if splitext(image)[-1] == ".png" or splitext(image)[-1] == ".jpeg":
        pass
    elif splitext(image)[-1] == "":
        image += ".png"
    else:
        raise ValueError("Wrong file extension ({})".format(image))
    # Reads the image with imageio and puts it into the images list
    images.append(imageio.imread(image))

# Mak sure that the file is a ".gif" one
if splitext(gif_path)[-1] == ".gif":    
    pass
elif splitext(gif_path)[-1] == "":
    gif_path += ".gif"
else:
    raise ValueError("Wrong file extension ({})".format(gif_path))

# imageio writes all the images in a .gif file at the gif_path   
imageio.mimsave(gif_path, images)

When I try this code with a list of images the Gif is correctly created but I have no idea how to change its parameters : What I mean by that is that I would like to be able to control the delay between the gif's images, and also to control how much time the gif's is running.

I have tried to my gif with the Image module from PIL, and change its info, but when I save it my gif turns into my first image.

Could you please help me understand what I am doing wrong?

here is the code that I ran to try to change the gif prameter :

# Try to change gif parameters
my_gif = Image.open(my_gif.name)
my_gif_info = my_gif.info
print(my_gif_info)
my_gif_info['loop'] = 65535
my_gif_info['duration'] = 100
print(my_gif.info)
my_gif.save('./generated_gif/my_third_gif.gif')

Solution

  • You can just pass both parameters, loop and duration, to the mimsave/mimwrite method.

    imageio.mimsave(gif_name, fileList, loop=4, duration = 0.3)
    

    Next time you want to check which parameters can be used for a format compatible with imageio you can just use imageio.help(format name).

    imageio.help("gif")
    

    GIF-PIL - Static and animated gif (Pillow)

    A format for reading and writing static and animated GIF, based
    on Pillow.
    
    Images read with this format are always RGBA. Currently,
    the alpha channel is ignored when saving RGB images with this
    format.
    
    Parameters for reading
    ----------------------
    None
    
    Parameters for saving
    ---------------------
    loop : int
        The number of iterations. Default 0 (meaning loop indefinitely).
    duration : {float, list}
        The duration (in seconds) of each frame. Either specify one value
        that is used for all frames, or one value for each frame.
        Note that in the GIF format the duration/delay is expressed in
        hundredths of a second, which limits the precision of the duration.
    fps : float
        The number of frames per second. If duration is not given, the
        duration for each frame is set to 1/fps. Default 10.
    palettesize : int
        The number of colors to quantize the image to. Is rounded to
        the nearest power of two. Default 256.
    subrectangles : bool
        If True, will try and optimize the GIF by storing only the
        rectangular parts of each frame that change with respect to the
        previous. Default False.