私は、画面のスナップショットを取り、テンプレート マッチングを行い、それに応じて応答する小さな自動化ツールに取り組んでいます。以前はこれに 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 は実際にピクセル データを格納しているように見えますが、アクセス方法がわかりません。その基になるピクセル配列を取得するにはどうすればよいですか?