【问题标题】:Can I display image in full screen mode with PIL?我可以使用 PIL 以全屏模式显示图像吗?
【发布时间】:2018-04-29 04:49:24
【问题描述】:

如何使用 Python 图像库全屏显示图像?

from PIL import Image

img1 = Image.open ('colagem3.png');
img1.show ();

以全屏模式显示!

【问题讨论】:

  • 不适用于 PIL。 show() 只是打开一个临时 .bmp 图像文件,其中包含与该扩展名关联的默认应用程序。如果你想全屏显示图像,你需要手动使用subprocess 模块来生成一些接受命令行参数的图像查看应用程序,告诉它以全屏模式显示图像。您可能还需要创建自己的临时图像文件以传递给它。注意:没有必要在你的问题中大喊大叫——这不会让人们更好地理解。
  • 我明白了,但我该怎么做呢?只使用“OpenCV”?我很抱歉喊...
  • 既然你有PIL,你可以用它来创建临时文件。抱歉,我不太了解 OpenCV 以及它是否可以用作查看应用程序。 Windows 带有一个paint 并且有一个叫做“Windows 照片查看器”(photoviewer.dll) 的东西,如果它们支持可以执行您想要的命令行参数,它可能是合适的。还有其他一些免费的成像视图应用程序,您也可以使用它们(如果它们具有全屏查看功能和调用它的命令行参数)。
  • 在我的 Windows 7 计算机上,照片查看器的路径是 C:\Program Files\Windows Photo Viewer\PhotoViewer.dll,所以看起来您可以使用参数 C:\Windows\System32\rundll32.exe "C:\Program Files\Windows Photo Viewer\PhotoViewer.dll" ImageView_Fullscreen "<image file path>" 间接调用它。
  • 我不明白......如何“间接调用”?

标签: python windows python-imaging-library fullscreen pillow


【解决方案1】:

问题的核心

PIL 没有全屏打开图像的原生方式。这是有道理的,它不能。 PIL 所做的只是在默认的.bmp 文件查看程序(通常是 Windows 上的 Windows 照片 [尽管这取决于 Windows 版本])中打开您的文件。为了全屏打开该程序,PIL 需要知道发送程序的参数。没有标准的语法。因此,这是不可能的。

但是,这并不意味着没有解决方案可以全屏打开图像。通过使用 Python 中的原生库 Tkinter,我们可以创建自己的全屏显示图像的窗口。

兼容性

为了避免依赖系统(直接调用 .dll 和 .exe 文件)。这可以通过 Tkinter 完成。 Tkinter 是一个显示库。此代码可以在任何运行 Python 2 或 3 的计算机上完美运行。


我们的功能

import sys
if sys.version_info[0] == 2:  # the tkinter library changed it's name from Python 2 to 3.
    import Tkinter
    tkinter = Tkinter #I decided to use a library reference to avoid potential naming conflicts with people's programs.
else:
    import tkinter
from PIL import Image, ImageTk

def showPIL(pilImage):
    root = tkinter.Tk()
    w, h = root.winfo_screenwidth(), root.winfo_screenheight()
    root.overrideredirect(1)
    root.geometry("%dx%d+0+0" % (w, h))
    root.focus_set()    
    root.bind("<Escape>", lambda e: (e.widget.withdraw(), e.widget.quit()))
    canvas = tkinter.Canvas(root,width=w,height=h)
    canvas.pack()
    canvas.configure(background='black')
    imgWidth, imgHeight = pilImage.size
    if imgWidth > w or imgHeight > h:
        ratio = min(w/imgWidth, h/imgHeight)
        imgWidth = int(imgWidth*ratio)
        imgHeight = int(imgHeight*ratio)
        pilImage = pilImage.resize((imgWidth,imgHeight), Image.ANTIALIAS)
    image = ImageTk.PhotoImage(pilImage)
    imagesprite = canvas.create_image(w/2,h/2,image=image)
    root.mainloop()

用法

pilImage = Image.open("colagem3.png")
showPIL(pilImage)

输出

它会创建一个全屏窗口,您的图像以黑色画布为中心。如果需要,您的图像将被调整大小。这是它的视觉效果:

注意:使用转义关闭全屏

【讨论】:

  • 好主意,也很便携。
  • 干得好!但是,我做了一些测试,一些图像没有调整大小并且是集中的......例如:如果我将图像推得太大(1600x1600)它会占用大部分屏幕......
  • @SóstenesMelo 我刚刚更新了它。如果需要,它现在支持图像大小调整。它使图像正确居中。
  • @nfnneil 谢谢!它正在工作。但是如何使图像在屏幕上居中?
  • @SóstenesMelo 我在几分钟后对其进行了更新以解决该问题。继续,用新的重试。我将位置更改为w/2, h/2
猜你喜欢
  • 1970-01-01
  • 2018-01-10
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 2016-12-15
  • 2022-07-27
相关资源
最近更新 更多