0

私は、画面のスナップショットを取り、テンプレート マッチングを行い、それに応じて応答する小さな自動化ツールに取り組んでいます。以前はこれに PIL を使用していましたが、そのImageGrab機能はメイン モニターに限定されており、マシンに接続されている任意のディスプレイ デバイスを取得するオプションが必要です。簡単なグーグル検索の後、解決策として次のコードにたどり着きました。

スクリーンショット コード

def capture_display():
    monitors = win32api.EnumDisplayMonitors(None, None)
    hwnd = monitors[1][1].handle
    l,t,r,b = monitors[1][2]
    w = r - l
    h = b

    hwndDC = win32gui.GetWindowDC(hwnd)
    mfcDC  = win32ui.CreateDCFromHandle(hwndDC)
    saveDC = mfcDC.CreateCompatibleDC()

    saveBitMap = win32ui.CreateBitmap()
    saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)
    saveDC.SelectObject(saveBitMap)
    saveDC.BitBlt((0, 0), (w, h),  mfcDC,  (l, t),  win32con.SRCCOPY)
    saveBitMap.SaveBitmapFile(saveDC,  'screencapture.bmp')

これは非常にうまく機能します。ただし、画像は保存されます。必要なのは、メモリ内の基になるピクセル配列にアクセスすることだけです。

もちろん、保存して PIL 経由でディスクからリロードし、ピクセル データを取得するというオプションもありますが、IO オーバーヘッドが大きすぎて役に立ちません。

現在、私は Windows API を使用して外国にいますが、MSDN を読んでいると、次のことがわかりました。

メモリ デバイス コンテキスト

これは、通常の描画面で作成されたビットマップのカラー データを格納するためにアプリケーションが一時的に使用できる、メモリ内のビット配列です。ビットマップはデバイスと互換性があるため、メモリ DC は互換性のあるデバイス コンテキストと呼ばれることもあります。

したがって、これらの DC は実際にピクセル データを格納しているように見えますが、アクセス方法がわかりません。その基になるピクセル配列を取得するにはどうすればよいですか?

4

1 に答える 1

2

最も簡単な方法は、GetDIBits関数を使用することです (Python の場合ctypes.windll.gdi32.GetDIBits): http://msdn.microsoft.com/en-us/library/windows/desktop/dd144879(v=vs.85).aspx

于 2013-03-12T19:55:21.890 に答える