如何在屏幕上显示 PIL 图像?

Posted

技术标签:

【中文标题】如何在屏幕上显示 PIL 图像?【英文标题】:How to show PIL images on the screen? 【发布时间】:2012-09-16 06:09:49 【问题描述】:

我正在使用 PIL 库进行一些图像编辑。关键是,我不想每次都将图像保存在我的硬盘上以在资源管理器中查看它。是否有一个小模块可以让我简单地设置一个窗口并显示图像?

【问题讨论】:

显示图像如何?在浏览器中? 在 python 制作的窗口中。类似于 pygame 的窗口。我可以在 pygame 中做到这一点,但我想要一个更好的解决方案。 为什么不保存呢? 可以说我有 100 张小图片要浏览。如果我可以将它们全部打印在我的屏幕上,而不必在其他程序中打开它们,那就更好了。我对 wxpython 不是很熟悉。简单吗? 您将需要一些窗口库——无论是 pygame、wxPython、TkInter、PyQt、PyGtk、PyWin32、PyObjC 等——来打开一个窗口。一旦你打开了一个窗口,它们中的大多数就可以轻松地在那个窗口中显示图像。 【参考方案1】:

这对我有用:

roses = list(data_dir.glob('roses/*'))
abc = PIL.Image.open(str(roses[0]))
PIL.Image._show(abc)

【讨论】:

【参考方案2】:

是的,PIL.Image.Image.show() 简单方便。

但是如果你想把图像放在一起,做一些比较,那么我建议你使用matplotlib。下面是一个例子,

import PIL
import PIL.IcoImagePlugin
import PIL.Image
import matplotlib.pyplot as plt

with PIL.Image.open("favicon.ico") as pil_img:
    pil_img: PIL.IcoImagePlugin.IcoImageFile  # You can omit. It helps IDE know what the object is, and then it will hint at the method very correctly.
    out_img = pil_img.resize((48, 48), PIL.Image.ANTIALIAS)

    plt.figure(figsize=(2, 1))  # 2 row and 1 column.
    plt.subplots_adjust(hspace=1)  # or you can try: plt.tight_layout()
    plt.rc(('xtick', 'ytick'), color=(1, 1, 1, 0))  # set xtick, ytick to transparent
    plt.subplot(2, 1, 1), plt.imshow(pil_img)
    plt.subplot(2, 1, 2), plt.imshow(out_img)
    plt.show()

【讨论】:

【参考方案3】:

你可以使用pyplot来显示图片:

from PIL import Image
import matplotlib.pyplot as plt
im = Image.open('image.jpg')
plt.imshow(im)

【讨论】:

请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。【参考方案4】:

从PIL Tutorial的开头附近:

一旦你有了 Image 类的实例,你就可以使用这些方法 由此类定义以处理和操作图像。为了 例如,让我们显示我们刚刚加载的图像:>>> im.show()

更新:

如今Image.show() 方法在Pillow fork of PIL 中是formally documented,并说明了它是如何在不同操作系统上实现的。

【讨论】:

这实际上是我想要的,但我得到一个 Windows Live 照片库错误。 0x800706ba 这是因为 Windows live 照片库与调用该方法时创建的临时文件 PIL 的类型相关联——在 Windows 上可能默认为 .bmp,它不支持现代的许多功能图像文件格式。尝试在调用im.show() 之前将图像格式属性显式设置为.png(即im.format = "PNG")。 问题仍然存在。我实际上可能会尝试一个窗口库。 PIL 内置的show() 方法是“脚本其他程序来显示它”的最简单版本。 (在早期的 Windows 系统上,您最终会得到一大堆 MSPaint 窗口。)即使它不起作用,也值得建议和尝试。你实际上可以做类似的事情,而且几乎一样简单,比如说,在每个图像上显式启动 MSPaint.exe…… @abarnert:实际上问题听起来像bug in Windows Live Photo Gallery 2011,并且有一个更新的版本可以是download,它可以解决PIL show() 问题。【参考方案5】:

我对此进行了测试,对我来说效果很好:

from PIL import Image
im = Image.open('image.jpg')
im.show()

【讨论】:

虽然这可能会回答问题(未经测试),但最佳做法是在您的代码中提供关于 SO 的解释。实际上不鼓励只给出代码答案。 这似乎不适用于 google colab notebook。 @kawingkelvin 问题是“如何在屏幕上显示 PIL 图像?”。您应该在其他地方寻求您的具体情况的答案......也许在这里:***.com/questions/55288657/… 这与我的回答有何不同?【参考方案6】:

您可以使用 Tkinter 在您自己的窗口中显示图像,取决于您系统中安装的图像查看器:

import Tkinter as tk
from PIL import Image, ImageTk  # Place this at the end (to avoid any conflicts/errors)

window = tk.Tk()
#window.geometry("500x500") # (optional)    
imagefile = path_to_your_image_file
img = ImageTk.PhotoImage(Image.open(imagefile))
lbl = tk.Label(window, image = img).pack()
window.mainloop()

对于 Python 3,将 import Tkinter as tk 替换为 import tkinter as tk

【讨论】:

您在哪里看到代码涉及将图像保存到磁盘?该问题要求一种编辑图像的方法,而无需每次都将其保存在磁盘上。但是您必须在开始时至少从磁盘打开一次映像。然后,您可以处理和查看内存中加载的图像为“img”多次,无需涉及任何磁盘操作。【参考方案7】:

如果您发现 PIL 在某些平台上存在问题,使用本机图像查看器可能会有所帮助。

img.save("tmp.png") #Save the image to a PNG file called tmp.png.

对于 MacOS:

import os
os.system("open tmp.png") #Will open in Preview.

对于大多数带有 X.Org 和桌面环境的 GNU/Linux 系统:

import os
os.system("xdg-open tmp.png")

For Windows:

import os
os.system("powershell -c tmp.png")

【讨论】:

Feather,在 MacOS 上,它不一定会在 Preview 中打开,而是在文件类型的默认值中打开。我正在处理一些大型 jpg 文件,这些文件将 Preview 转换为 .png,大约需要 20 秒。将 jpg 默认更改为 Chrome 效果很好……【参考方案8】:

也许您可以为此使用 matplotlib,也可以使用它绘制普通图像。如果您调用 show(),图像会在窗口中弹出。看看这个:

http://matplotlib.org/users/image_tutorial.html

【讨论】:

以上是关于如何在屏幕上显示 PIL 图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 视图中显示 PIL 图像对象?

如何使用 PIL 放大图像的某个部分?

如何使用 PIL 在单个白色背景上检测和裁剪多个图像?

如何在 Python 中使用 PIL 将图像合成到另一个图像上?

如何将 pygame Surface 转换为 PIL 图像?

PIL如何根据图像大小缩放文本大小