2012-10-11 22 views
10

コンテキスト:別のウィンドウのスクリーンショットを取ってOpenCVに送り込もうとしています。私はBITMAPをOpenCVと連携できるものに変換できるはずのWeb上にいくつかのコードを見つけました。残念ながら私はいくつかの問題に遭遇しました。なぜGetObjectはnullのbmBitsでBITMAPを返しますか?

質問:なぜbmBits属性/メンバーは常にnullですか? bmBits部材は、DIBセクションの非ヌルである

#include <iostream> 
#include <string> 
#include <Windows.h> 

int main(int argc, char* argv[]) 
{ 
    std::wstring windowName = L"Calculator"; 

    RECT rect; 
    HWND hwnd = FindWindow(NULL, windowName.c_str()); 
    if (hwnd == NULL) 
    { 
     return 0; 
    } 
    GetClientRect(hwnd, &rect); 

    HDC hdcScreen = GetDC(NULL); 
    HDC hdc = CreateCompatibleDC(hdcScreen); 
    HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen, 
     rect.right - rect.left, rect.bottom - rect.top); 
    SelectObject(hdc, hbmp); 

    PrintWindow(hwnd, hdc, PW_CLIENTONLY); 

    BITMAP bmp; 
    GetObject(hbmp, sizeof(BITMAP), &bmp); 

    return 0; 
} 
+0

あなただけのオフ手、このコードでスクリーンショットをしようとしていますか?そのように見える。その場合、PrintWindowは必要なものではありません。それは、ダンプするDCを持つWM_PRINTをターゲットウィンドウに送信することだけです。ウィンドウがそのメッセージを処理するという保証はありません。そうであれば、あなたが望むことをしてください。ほとんどの場合、必要なものはすべて用意されていますが、BitBlt()を使用して画面DCから互換DCにビットを引き込む必要があると思います。 – WhozCraig

答えて

16

(Iはまた、代わりのBitBltのPrintWindowと試みた結果は同じでした)。デバイス依存のビットマップ(作成しているビットマップなど)では、ピクセルがメインメモリではなくビデオカード上にあるため、bmBitsは設定されません。

この例では、ビットに直接アクセスする場合は、CreateCompatibleBitmapCreateDIBSectionに変更する必要があります。

7

ファイルからビットマップをロードし、(glTexImage2DglDrawPixels用)BITMAP .bmBits使用する場合:

LoadImage(NULL, "path_to.bmp", IMAGE_BITMAP, 0, 0, 
             LR_LOADFROMFILE); 

をuはLR_CREATEDIBSECTION

HBITMAP hBmp = NULL; 
BITMAP BMp; 
hBmp = (HBITMAP) LoadImage(NULL, "bitmap.bmp", IMAGE_BITMAP, 0, 0, 
             LR_LOADFROMFILE | LR_CREATEDIBSECTION); 
GetObject(hBmp, sizeof(BMp), &BMp); 
//BMp.bmBits now points to data 
+0

これは私が今までに見た唯一の答えです。あなたは、素晴らしいです! –

-1

あなたはできることの一つのフラグを指定する必要があります。 GetObjectの戻り値を調べることです。 0の場合、何かが間違っていることがわかります。コールのパラメータに問題があります。

0

GetObject MSDNのドキュメント。第2段落に注意してください。

HGDIOBJCreateDIBSectionを呼び出すことによって作成されたビットマップへのハンドルで、指定されたバッファが十分に大きい場合、のGetObject機能はDIBSECTION構造体を返します。加えて、DIBSECTIONに含まれる構造体のbmBitsメンバには、ビットマップのビット値へのポインタが含まれます。

HGDIOBJは、幅、高さ、およびビットマップのカラーフォーマット情報、のGetObject戻り任意の他の手段によって作成されたビットマップへのハンドルである場合。 GetDIBitsまたはGetBitmapBits関数を呼び出して、ビットマップのビット値を取得できます。

関連する問題