我正在使用Python构建一个图像渲染应用程序,将numpy数组渲染为图像。我需要一种自动计算屏幕DPI的方法,因为我在不同的监视器上生成相同大小的图像(例如2x2英寸)。我使用的操作系统是Windows 10,Python版本为3.7。
我不是在问如何获取监视器的屏幕大小 - 例如查找您的监视器是否为3000x2000像素(如已在以下链接中解决:如何在Python中获取监视器分辨率?)。
相反,我想要一些特别计算DPI的东西,并考虑到用户应用的任何比例设置可能会更改其系统的DPI。例如,我将比例设置为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。
GetDpiForWindow()
和winDpi = user32.GetDpiForWindow(window)
。 - mnisticwindow=0
时,我只会得到返回的 0。除非我设置错了? - ericGetDpiForWindow()
,使用GetDpiForSystem()
获取系统 DPI,即sysDpi = user32.GetDpiForSystem()
。 - mnisticwindll.user32
的东西不是很擅长 :/ - eric