Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to display an animated gif with Linux?

I want to open a GIF image from the python console in Linux. Normally when opening a .png or .jpg, I would do the following:

>>> from PIL import Image                                                                                
>>> img = Image.open('test.png')
>>> img.show()

But if I do this:

>>> from PIL import Image                                                                                
>>> img = Image.open('animation.gif')
>>> img.show()

Imagemagick will open but only show the first frame of the gif, not the animation.

Is there a way to show the animation of the GIF in a viewer in Linux?

like image 813
user40974 Avatar asked Jan 28 '12 14:01

user40974


People also ask

How do I display an animated GIF?

Internet Explorer in Windows 10 allows you to open and view animated GIF images. To open a GIF image, click the File menu in Internet Explorer (press Alt key to see the menu), click Open, click Browse, change the file type to All Files, select the GIF, click Open, and then click OK button to view the GIF.

How do you display a GIF in HTML?

Animated images in HTML are an image on a web page that moves. It is in GIF format i.e. Graphics Interchange Format file. To add an animated image in HTML is quite easy. You need to use the <image> tag with the src attribute.


1 Answers

Image.show dumps the image to a temporary file and then tries to display the file. It calls ImageShow.Viewer.show_image (see /usr/lib/python2.7/dist-packages/PIL/ImageShow.py):

class Viewer:
    def save_image(self, image):
        # save to temporary file, and return filename
        return image._dump(format=self.get_format(image))
    def show_image(self, image, **options):
        # display given image
        return self.show_file(self.save_image(image), **options)
    def show_file(self, file, **options):
        # display given file
        os.system(self.get_command(file, **options))
        return 1

AFAIK, the standard PIL can not save animated GIfs1.

The image._dump call in Viewer.save_image only saves the first frame. So no matter what viewer is subsequently called, you only see a static image.

If you have Imagemagick's display program, then you should also have its animate program. So if you have the GIF as a file already, then you could use

animate /path/to/animated.gif

To do so from within Python, you could use the subprocess module (instead of img.show):

import subprocess

proc = subprocess.Popen(['animate', '/path/to/animated.gif'])
proc.communicate()

1According to kostmo, there is a script to save animated GIFS with PIL.


To show the animation without blocking the main process, use a separate thread to spawn the animate command:

import subprocess
import threading

def worker():
    proc = subprocess.Popen(['animate', '/path/to/animated.gif'])
    proc.communicate()

t = threading.Thread(target = worker)
t.daemon = True
t.start()
# do other stuff in main process
t.join()
like image 129
unutbu Avatar answered Oct 10 '22 13:10

unutbu