如何在屏幕上显示 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 图像?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 中使用 PIL 将图像合成到另一个图像上?