3

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*GetDIBitsHBITMAP

このアプローチの問題は、データを 2 回コピーしたことです。1 回目BitBltはウィンドウ DC からHBITMAPメモリ DC で選択されたものにコピーし、次に再度からHBITMAPFreeImage メモリ バッファにコピーしました。この非効率性を取り除き、データを操作の生のポインターに直接コピーしたいと考えていBitBltます。HBITMAPこれが機能するには、選択されたメモリDCが必要であり、HBITMAPWindowsが割り当てたメモリではなく、メモリバッファを指しています。

どうすればこれを達成できますか?

4

0 に答える 0