计算屏幕DPI

2024-10-01 09:23:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Python构建一个图像渲染应用程序,将numpy数组渲染为图像。我需要一种方法来自动计算屏幕DPI,因为我正在不同的监视器上生成相同大小的图像(例如2x2英寸)。我使用的是Windows10,Python3.7。在

我不是在问如何获得显示器的屏幕尺寸,比如找出显示器是否为3000x2000像素(如在:How do I get monitor resolution in Python?处解决的)。在

相反,我想要的是专门计算DPI的东西,并考虑到用户应用的任何可能改变其系统DPI的比例设置。E、 g,我把刻度设为250%。在

在专家交流会(https://www.experts-exchange.com/questions/21794611/Detecting-system-DPI-settings-in-Python.html)上给出了这个答案,我尝试使用以下方法:

from ctypes import windll

def get_ppi():
    LOGPIXELSX = 88
    LOGPIXELSY = 90
    user32 = windll.user32
    user32.SetProcessDPIAware()
    dc = user32.GetDC(0)   
    pix_per_inch = windll.gdi32.GetDeviceCaps(dc, LOGPIXELSX)
    print("Horizontal DPI is", windll.gdi32.GetDeviceCaps(dc, LOGPIXELSX))
    print("Vertical DPI is", windll.gdi32.GetDeviceCaps(dc, LOGPIXELSY))
    user32.ReleaseDC(0, dc)
    return pix_per_inch

这似乎是正确的,但返回的值太低。它返回240,而我的实际DPI接近285。在

我更希望避免使用Qt这样的GUI框架,因为我希望最小化开销,但是如果这是唯一的方法,那么我会的!如果必须使用框架,我更喜欢PyQt5。在


Tags: 方法in图像get屏幕dc显示器dpi
1条回答
网友
1楼 · 发布于 2024-10-01 09:23:16

虽然我说我想避免它,但是有一个非常简单的方法可以使用PyQt5来实现这一点。我越想越觉得这可能是最好的解决方案,因为它基本上是独立于平台的:

import sys
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
screen = app.screens()[0]
dpi = screen.physicalDotsPerInch()
app.quit()

注意,app.screens()返回一个屏幕列表。在我的情况下,我只有一个附加,但你可能有多个,所以一定要知道你需要从哪个屏幕获得dpi。如果你把所有这些都包含在一个函数中,它就不会用PyQt垃圾来扰乱你的命名空间。在

另外,有关QScreen的更多信息(sc是一个QScreen对象),请参见本文档页:
https://doc.qt.io/qt-5/qscreen.html

你可以从中找到很多很酷的东西。在

相关问题 更多 >