我正在使用Python构建一个图像渲染应用程序,该应用程序将numpy数组呈现为图像。我需要一种自动计算屏幕DPI的方法,因为我正在不同的显示器(例如2x2英寸)上生成相同大小的图像。我在Windows 10,Python 3.7中。
我不是在问如何获得显示器的屏幕尺寸-就像找出显示器是否为3000x2000像素(已通过How do I get monitor resolution in Python?解决)。
相反,我想要一种可以专门计算DPI的工具,并且考虑到用户应用的可能会改变其系统DPI的任何比例设置。例如,我将比例设置为250%。
在Experts-exchange(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。
最佳答案
虽然我说过我想避免这种情况,但是有一种非常简单的方法可以使用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垃圾而使您的 namespace 困惑。另外,有关QScreen的更多信息(
sc
是QScreen对象),请参见以下文档页面:https://doc.qt.io/qt-5/qscreen.html
您可以从中汲取各种有趣的东西。
关于python - 计算屏幕DPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54271887/