Python - Pillow ImageShow.show() 不显示图像 (Raspbian)

Phython - Pillow ImageShow.show() isn't displaying images (Raspbian)

我想做的就是在 Raspberry Pi 3

上使用 Pillow 显示图像

首次尝试使用此代码:

from PIL import Image 
from PIL import ImageShow

imageA = Image.open('Moth.png')
ImageShow.show(imageA)
print("Done")

它没有用,没有错误代码,什么都没有,它只是完全跳过了代码

我仔细研究了一下,发现图像显示器可能有问题,所以我尝试像这样添加它:

from PIL import Image 
from PIL import ImageShow

imageA = Image.open('Moth.png')
ImageShow.show(imageA,title=None,command='GPicView')
print("Done")

也没用,我也试过安装fim和使用

ImageShow.show(imageA,title=None,command='fim')

就像本网站上建议的答案之一,但这也不起作用

我确定fim已经正确安装了,所以代码肯定有问题,但是我不明白是什么,也许我没有正确导入ImageShow?

我也试过使用

imageA.show(command='fim')

但它产生相同的结果

我是 Python 编码的新手(一般而言),所以也许我只是在做一些愚蠢的事情而没有意识到

更新答案

我认为 PIL/Pillow 的较新版本使用 xdg-open 命令来显示图像。在内部,PIL/Pillow 将您的 in-memory 图像保存为磁盘上的 PNG 文件并调用 OS 的查看器来查看 on-disk PNG。因此,我认为必须有一种方法可以将 MIME-type "image/png" 的默认查看器设置为您选择的查看器,但作为 Mac 用户,我不确定你会怎么做 - 我想可以使用 xdg-mime 命令。

原答案

我认为 PIL/Pillow 在 Unix/Linux 系统上显示时是这样的:

  • 它期望并希望找到 display,它是 ImageMagick
  • 的一部分
  • 它将使用 eog “侏儒之眼” 如果找到它
  • 它将回落到 xv

因此,根据您的skill-set、耐心、disk-space、使用特定查看器的愿望,有多种可能性。我不知道那些参数,所以这里有一些可能性:

选项: 安装 ImageMagick 使用:

sudo apt install imagemagick

选项: 安装 eog 使用:

sudo apt install eog

选项: 安装 xv - 我手头没有确切的命令

选项: 安装 feh 或其他一些查看器并将其符号链接到 display 所以 PIL/Pillow 认为它正在使用 ImageMagick display

sudo apt install feh
sudo ln -s /usr/bin/feh /usr/bin/display

另一种选择可能是创建一个自定义查看器作为从 PIL 的 UnixViewer 派生的 class,它将自己置于查看器列表的顶部,因此首先使用它。

因此,创建一个名为 "CustomViewer.py" 的文件,如下所示 - 我使用的是 feh 查看器,但您可以使用任何您喜欢的应用程序:

#!/usr/bin/env python3

import shutil
import sys

from PIL import Image, ImageShow

class CustomViewer(ImageShow.UnixViewer):
   format = "PNG"
   options = {"compress_level": 1}

   def get_command_ex(self, file, **options):
      command = executable = "feh"
      return command, executable

if shutil.which("feh"):
   print(f'Registering custom viewer for PIL')
   ImageShow.register(CustomViewer, order=-1) # Insert as primary viewer

然后,在您要使用自定义查看器的常规 Python 代码中,只需添加:

import CustomViewer

它会输出一条消息,说明它已加载,任何后续调用 show() 都将使用您的自定义查看器。