FreeImageライブラリを使用して、ビットマップ データを保存および操作しています。私のコードの一部では、(Windows で) ウィンドウのスクリーンショットを撮り、FBITMAP*
(FreeImage のビットマップ データ構造) として保存する必要があります。これを行うために私が考案した方法には、2 つのステップが含まれます。画像をキャプチャしてから、FBITMAP*
.
画像をキャプチャするには、次のようにします。
HWND window; // Assume this is a valid handle to my window
int width; // width of window client area
int height; // height of window client area
HDC windowDC = GetDC(window);
HDC captureDC = CreateCompatibleDC(windowDC);
HBITMAP screenshot = CreateCompatibleBitmap(windowDC, width, height);
SelectObject(captureDC, screenshot);
BitBlt(captureDC, 0, 0, width, height,
captureDC, 0, 0, SRCCOPY|CAPTUREBLT);
ReleaseDC(window, windowDC);
DeleteDC(captureDC);
FreeImage は、ピクセル データへの生のポインターを返す関数を提供します。
BYTE* FreeImage_GetBits(FBITMAP*)
FAQでは、 (ビットマップへの WinAPI ハンドル)を usingHBITMAP
に変換できると説明しています。これは、ソースと宛先の生ポインターを引数として取り、ピクセル データを一方から他方にコピーします。FBITMAP*
GetDIBits
HBITMAP
このアプローチの問題は、データを 2 回コピーしたことです。1 回目BitBlt
はウィンドウ DC からHBITMAP
メモリ DC で選択されたものにコピーし、次に再度からHBITMAP
FreeImage メモリ バッファにコピーしました。この非効率性を取り除き、データを操作の生のポインターに直接コピーしたいと考えていBitBlt
ます。HBITMAP
これが機能するには、選択されたメモリDCが必要であり、HBITMAP
Windowsが割り当てたメモリではなく、メモリバッファを指しています。
どうすればこれを達成できますか?