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

118

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


如何显示图片?在浏览器中显示吗? - user554546
1
为什么你不想保存它? - Joran Beasley
1
假设我有100张小图片要查看。如果我能在屏幕上打印出它们所有的话,而不必在其他程序中打开它们,那就更好了。我对wxPython并不是很熟悉。它简单吗? - Bartlomiej Lewandowski
1
你需要一些窗口库——无论是pygame、wxPython、TkInter、PyQt、PyGtk、PyWin32、PyObjC等等——来打开一个窗口。一旦你打开了一个窗口,大多数库都可以轻松地在窗口中显示图像。 - abarnert
PIL与TkInter有许多内置集成,并且它是唯一内置于Python的窗口库。因此,如果您没有偏好,可以从那里开始。大多数没有接触过它(或Tcl/Tk)的人都不喜欢它,但是如果您不做任何复杂的事情,学习TkInter的基础知识应该比安装wx并学习wx的基础知识更容易。另一方面,如果您已经了解pygame并已经安装了它,那么这需要更多的工作,但可能仍然比学习全新的系统容易。 - abarnert
显示剩余4条评论
8个回答

162

以下是来自PIL教程的开头:

一旦您拥有Image类的实例,您可以使用该类定义的方法来处理和操作图像。例如,让我们显示刚刚加载的图像:

     >>> im.show()

更新:

现在,Image.show()方法已经在Pillow fork of PIL正式记录,并解释了它在不同操作系统上的实现方式。


3
这是因为Windows live照片库与调用该方法创建时生成的临时文件类型相关联,该文件类型可能默认为在 Windows 上不支持现代图像文件格式的 .bmp。尝试在 im.show() 调用之前将图像格式属性显式设置为 .png(即 im.format = "PNG")。 - martineau
3
PIL内置的show()方法是“脚本其他程序来显示图像”的最简单版本。(在早期的Windows系统中,您可能会得到一堆MSPaint窗口。)即使它无法正常工作,建议并尝试也是值得的。您实际上可以通过显式启动每个图像的MSPaint.exe来做类似且几乎同样简单的事情... - abarnert
3
实际上,这个问题听起来像是 Windows Live Photo Gallery 2011 的一个 bug(漏洞),有一个新版本可以下载,可能会修复 PIL 中 show() 的问题。原文链接:http://support.microsoft.com/kb/2581947 下载链接:http://www.microsoft.com/en-us/downloaded/details.aspx?id=29219 - martineau
你不能将这些文件与更好的东西关联起来吗,比如XnView? - endolith
@endolith:正如我在早些评论中所说的那样,im.show()将使用与PIL创建的临时文件类型相关联的应用程序打开图像,因此如果这恰好是XnView,则可能会发生这种情况。许多应用程序会自动执行此操作(或在安装时询问您是否要执行此操作)。PIL的默认设置可能是为了避免需要安装第三方软件。 - martineau
显示剩余6条评论

34

我测试过这个方法,对我来说可以正常工作:

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

1
虽然这可能回答了问题(未经测试),但最好在SO上提供代码解释的最佳实践。仅提供代码答案实际上是不鼓励的。 - d_kennetz
2
这似乎在谷歌协作笔记本上无法正常工作。 - kawingkelvin
3
如何在屏幕上显示 PIL 图像?请在其他地方寻找适合您特定情况的答案,例如在这里:https://dev59.com/kFMI5IYBdhLWcg3w0O3R - Hrvoje
1
这与我的答案有什么不同? - martineau

12

您可以使用pyplot显示图像:

from PIL import Image
import matplotlib.pyplot as plt
im = Image.open('image.jpg')
plt.imshow(im)
plt.show() # image will not be displayed without this

1
请不要仅仅发布代码作为答案,还要提供解释您的代码是如何解决问题的。带有解释的答案通常更有帮助和更高质量,并且更有可能吸引赞同。 - Tyler2P

11
如果你发现 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")

对于 Windows:

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

在 MacOS 上,Feather 不一定会在 Preview 中打开,而是使用文件类型的默认程序。我正在处理一些大型 jpg 文件,Preview 会将其转换为 .png,需要约 20 秒的时间。将 jpg 的默认程序更改为 Chrome 可以大大提高效率... - John White

7
也许你可以使用matplotlib来完成这个任务,你也可以用它来绘制普通的图像。如果你调用show()函数,图像将会在一个窗口中弹出。看一下这个例子:

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


5

您可以使用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


4
你在哪里看到代码涉及将图像保存到磁盘?问题要求找到一种在每次编辑图像时无需将其保存到磁盘的方法。但你必须至少在开始时从磁盘打开图像。然后,您可以在内存中处理和查看已加载为“img”的图像,而不涉及任何磁盘操作。 - Apostolos

1
这是对我有效的方法:
roses = list(data_dir.glob('roses/*'))
abc = PIL.Image.open(str(roses[0]))
PIL.Image._show(abc)

对我来说,PIL.Image.show(img)是有效的。 - slashdottir

1

是的,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()

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接