Pythonでグラフィックボード情報と解像度、拡大率を簡単に取得する方法

Python

グラフィックボード情報、画面解像度、拡大率を取得するには?

業務プログラムを作成しているとクライアントPCの画面解像度や拡大率を取得したい場合があります。近年特に画面サイズが大きくなってきていることからクライアントPC側で拡大率を変更することによりEXCELの印刷範囲が変わったり図形配置がずれることが多くなっています。実際に筆者も原因追及に苦労した経験があります。

クライアントPCの画面情報をデータベースへログ出力などをすることにより、事前に把握して対応しやすくすることができます。

※WMIモジュールを利用しているのでWindowsのみで動作可能です。

PCの画面情報を取得するサンプルコード

PCの画面情報を取得するサンプルコードを紹介します。

import wmi  # Windows Management Instrumentation (WMI) を使用するためのモジュール
import tkinter as tk  # GUIアプリケーション作成のための標準的なPythonインターフェース

def get_graphics_info():
    """
    Windows上でグラフィックボードの情報を取得し、それをリスト形式で返します。
    
    グラフィックボードから名前、現在の解像度(幅、高さ)、色深度、リフレッシュレートを取得し、
    これらの情報を辞書に格納してリストに追加します。

    Returns:
        list of dict: 各辞書には、名前、幅、高さ、色深度、リフレッシュレートが含まれる。
    """
    # WMIオブジェクトの作成
    c = wmi.WMI()  
    
    # グラフィックボードの情報を格納するリスト
    graphics_info = []  

    # システムに接続されているビデオコントローラー(グラフィックボード)の情報を取得
    for gpu in c.Win32_VideoController():
        # 各グラフィックボードの情報を辞書として格納
        gpu_info = {
            "name": gpu.Name,  # ボード名
            "width": gpu.CurrentHorizontalResolution,   # 現在の水平解像度(幅)
            "height": gpu.CurrentVerticalResolution,    # 現在の垂直解像度(高さ)
            "color_depth": gpu.CurrentBitsPerPixel,     # 現在の色深度(ビット)
            "refresh_rate": gpu.CurrentRefreshRate      # 現在のリフレッシュレート(Hz)
        }
        
        # リストに情報を追加
        graphics_info.append(gpu_info)  

    return graphics_info

def get_screen_size():
    """
    使用しているPCの画面サイズ(幅と高さ)を辞書形式で返します。

    tkinterの機能を使用して、現在の画面解像度を取得します。

    Returns:
        list of dict: 画面の幅と高さをキーとする辞書のリスト。
    """
    
    # tkinterのルートウィンドウを作成
    root = tk.Tk()  
    
    # ウィンドウを表示せずに実行
    root.withdraw()  
    
    # 画面の幅を取得
    width = root.winfo_screenwidth()  
    
    # 画面の高さを取得
    height = root.winfo_screenheight()  
    
    # ルートウィンドウを破棄
    root.destroy()  
    
    # 画面サイズを辞書形式でリストにして返す
    return [{"width": width, "height": height}]  



##############################################################
# 関数のテスト
if __name__ == "__main__":


    graphics_board = get_graphics_info()[0]  # グラフィックボード情報のリストの最初の要素を取得 ※複数ボード非対応
    print(f"########################################")
    print(f"グラフィックボード情報")
    print(f"########################################")
    print(f"名前: {graphics_board['name']}")
    print(f"幅: {graphics_board['width']}px")
    print(f"高さ: {graphics_board['height']}px")
    print(f"色深度: {graphics_board['color_depth']}ビット")
    print(f"リフレッシュレート: {graphics_board['refresh_rate']}Hz")

    print()

    screen_size = get_screen_size()[0]  # 画面サイズ情報のリストの最初の要素を取得
    print(f"########################################")
    print(f"実画面サイズ情報")
    print(f"########################################")
    print(f"画面の幅: {screen_size['width']} px")
    print(f"画面の高さ: {screen_size['height']} px")

    print()

    # 画面の拡大率を算出
    if graphics_board:
        actual_width, actual_height = graphics_board['width'], graphics_board['height']
        
        # 画面の拡大率計算(幅)
        scale_width = actual_width / screen_size['width']  
        
        # 画面の拡大率計算(高さ)
        scale_height = actual_height / screen_size['height']  
        
        print(f"########################################")
        print(f"画面拡大率情報 ※幅、長さの比率は変わらないのでどちらかを取得でも可")
        print(f"########################################")
        print(f"画面の拡大率(幅): {scale_width * 100:.0f}%")
        print(f"画面の拡大率(高さ): {scale_height * 100:.0f}%")
    else:
        print("グラフィックボードの情報が取得できませんでした。")


WMIモジュールを使用していますので事前にモジュールをインストールする必要があります。以下を参照してインストールしてください。

pip install pywin32

実行結果

以下のようにグラフィックボード情報と画面サイズ情報が取れます。get_graphics_infoではグラフィックボードの設定から解像度を取得してget_screen_sizeでは拡大率適用後の解像度を取得しています。したがって画面拡大率情報についてはグラフィックボードの解像度÷実画面サイズの解像度で計算して割り出ししています。

下図の例では「画面の拡大率(幅)」は3840px÷3072px=1.25=125%の拡大率となります。

########################################
グラフィックボード情報
########################################
名前: Intel(R) Iris(R) Xe Graphics
幅: 3840px
高さ: 2160px
色深度: 32ビット
リフレッシュレート: 60Hz

########################################
実画面サイズ情報
########################################
画面の幅: 3072 px
画面の高さ: 1728 px

########################################
画面拡大率情報 ※幅、長さの比率は変わらないのでどちらかを取得でも可
########################################
画面の拡大率(幅): 125%
画面の拡大率(高さ): 125%

注意事項が2点あります。
1,tkinterでは複数枚ディスプレイでもメイン画面の解像度しか取得できない。
2,筆者は複数グラフィックボード積んだPCでテストしていないので拡大率が正しく取れない可能性がある。
ということで完全に対応できている状態ではないですが、企業などではPC1台で処理する場合がほとんどだと思いますので利用価値はあるかと考えています。

最後に

以上がPythonでグラフィックボード情報、画面解像度、拡大率を取得する方法です。

クライアントPCの画面設定状況を取得したい場合に活用してみてはいかがでしょうか。

コメント

タイトルとURLをコピーしました