繁体   English   中英

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

[英]Python - 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 将内存中的图像保存为磁盘上的 PNG 文件,并调用操作系统的查看器来查看磁盘上的 PNG。 所以,我认为必须有一种方法可以将 MIME 类型“image/png”的默认查看器设置为您选择的查看器,但作为 Mac 用户,我不确定您会怎么做 - 我猜是可以使用xdg-mime命令。

原始答案

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

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

因此,根据您的技能组合、耐心、磁盘空间、使用特定查看器的愿望,有多种可能性。 我不知道这些参数,所以这里有一些可能性:

选项:使用以下命令安装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的派生类,将其自身置于查看器列表的顶部,以便首先使用它。

因此,创建一个名为"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()的任何后续调用都将使用您的自定义查看器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM