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 не может сохранять анимированные 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 Согласно kostmo , есть скрипт для сохранения анимированных GIF-файлов с PIL.
Для отображения анимации без блокировкиосновной процесс, используйте отдельный поток для запуска команды 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()