Рассчитать DPI экрана - PullRequest
       17

Рассчитать DPI экрана

0 голосов
/ 20 января 2019

Я использую Python для создания приложения для рендеринга изображений, которое отображает массивы в виде изображений. Мне нужен способ автоматизации 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.

Я бы предпочел не использовать для этого среду GUI, такую ​​как Qt, так как я хочу минимизировать накладные расходы, но если это единственный способ, то я это сделаю! Если мне нужно использовать фреймворк, я бы предпочел PyQt5.

1 Ответ

0 голосов
/ 20 января 2019

Хотя я сказал, что хочу избежать этого, есть один очень простой способ осуществить это с помощью 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

Есть много разных интересных вещей, которые вы можете извлечь из этого.

...