【Python】獲取屏幕真實分辨率、縮放後的分辨率以及縮放比例

如果你在網上去搜如何用 Python 獲取屏幕分辨率,那麼肯定一堆人會告訴你用 win32 接口的 GetSystemMetrics 函數就可以了。

這雖然沒錯,但其實有一點疏漏。就是 GetSystemMetrics 獲取的只是經過系統記錄的分辨率,而非物理真實的分辨率。

所以會出現這種偏差,是因爲在windows系統裏面有一種叫做縮放的神奇東西,那些屏幕分辨率比較高的朋友對這玩意應該不陌生。

在這裏插入圖片描述

上圖是我的電腦的設置,我設置的是 2560x1600,縮放率爲 200%,所以調用 GetSystemMetrics 的結果爲:

In [1]: from win32.win32api import GetSystemMetrics

In [2]: GetSystemMetrics(0), GetSystemMetrics(1)
Out[2]: (1280, 800)

我隨便修改一下縮放,設置縮放比例爲 250%

在這裏插入圖片描述

這回再次運行的時候就變了:

In [4]: GetSystemMetrics(0), GetSystemMetrics(1)
Out[4]: (1024, 640)

注意到規律了嗎?

(1280,800)×2=(2560,1600)(1024,640)×2.5=(2560,1600) (1280, 800) \times 2 = (2560, 1600)\\ (1024, 640) \times 2.5 = (2560, 1600)

那如果想要獲得未經過縮放的分辨率 2560 x 1600 咋辦呢?可以這麼幹:

In [9]: from win32 import win32api, win32gui, win32print
In [10]: import win32con
In [11]: hDC = win32gui.GetDC(0)
In [12]: w = win32print.GetDeviceCaps(hDC, win32con.DESKTOPHORZRES)
In [13]: h = win32print.GetDeviceCaps(hDC, win32con.DESKTOPVERTRES)
In [14]: w, h
Out[14]: (2560, 1600)

最後附上完整的代碼。

from win32 import win32api, win32gui, win32print
from win32.lib import win32con

from win32.win32api import GetSystemMetrics


def get_real_resolution():
    """獲取真實的分辨率"""
    hDC = win32gui.GetDC(0)
    # 橫向分辨率
    w = win32print.GetDeviceCaps(hDC, win32con.DESKTOPHORZRES)
    # 縱向分辨率
    h = win32print.GetDeviceCaps(hDC, win32con.DESKTOPVERTRES)
    return w, h


def get_screen_size():
    """獲取縮放後的分辨率"""
    w = GetSystemMetrics (0)
    h = GetSystemMetrics (1)
    return w, h

real_resolution = get_real_resolution()
screen_size = get_screen_size()
print(real_resolution)
print(screen_size)

screen_scale_rate = round(real_resolution[0] / screen_size[0], 2)
print(screen_scale_rate)

顯示分辨率: (2560, 1600)
縮放後的分辨率: (1280, 800)
縮放比率: 2.0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章