我想在Linux中从python控制台打开一个GIF图像。通常在打开.png
或.jpg
时,我会执行以下操作:
>>> from PIL import Image
>>> img = Image.open('test.png')
>>> img.show()
但如果我这样做:
>>> from PIL import Image
>>> img = Image.open('animation.gif')
>>> img.show()
Imagemagick会打开但只显示gif的第一帧,而不是动画。
有没有办法在Linux中的查看器中显示GIF的动画?
答案 0 :(得分:5)
Image.show
将图像转储到临时文件,然后尝试显示该文件。它会调用ImageShow.Viewer.show_image
(请参阅/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,标准PIL can not save animated GIfs 1 。
image._dump
中的Viewer.save_image
电话仅保存第一帧。因此,无论后来调用哪个查看器,您只能看到静态图像。
如果你有Imagemagick的display
程序,那么你也应该拥有它的animate
程序。因此,如果您已将GIF作为文件,则可以使用
animate /path/to/animated.gif
要在Python中执行此操作,您可以使用子进程模块(而不是img.show
):
import subprocess
proc = subprocess.Popen(['animate', '/path/to/animated.gif'])
proc.communicate()
1 According to kostmo,有一个用PIL保存动画GIFS的脚本。
要在不阻塞主进程的情况下显示动画,请使用单独的线程生成animate
命令:
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()
答案 1 :(得分:2)
我用Fedora 17做到了这一点:
el@defiant ~ $ sudo yum install gifview
---> Package gifview.x86_64 0:1.67-1.fc17 will be installed
curl http://i.imgur.com/4rBHtSm.gif > mycat.gif
gifview mycat.gif
出现一个窗口,你可以逐步浏览gif的框架。