python - 计算屏幕DPI

标签 python dpi

我正在使用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/

相关文章:

android - 运行 4.4.2 的 SPH-L710 (Sprint Galaxy S III) 误报 xdpi 和 ydpi

java - 用 Java 将 dpi 元数据写入 jpeg 图像

c# - 如何编写自动缩放到系统字体和 dpi 设置的 WinForms 代码?

Android xxx-hdpi 真机

python - 通过环境变量将参数传递给Docker容器是一种好习惯吗?

python - PyPE ansi 还是 unicode?

python - 如何使用 Python PIL (Pillow) 将图像保存在特定文件目录中,而不会因 : save_handler = SAVE[format. upper() 而出现 KeyError]

python - Numpy 子数组的外部添加

python - 使用 scipy 组合 p 值

ios - iPhone 应用程序使用什么 dpi 分辨率?