11

コンテキスト:別のウィンドウのスクリーンショットを撮って OpenCV にフィードしようとしています。BITMAP を OpenCV で動作するものに変換できるはずのコードをウェブ上で見つけました。残念ながら、私はいくつかの問題に遭遇しました。

質問: bmBits 属性/メンバーが常に null なのはなぜですか? (BitBltの代わりにPrintWindowでも試してみましたが、結果は同じでした)

#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;
}
4

4 に答える 4

18

DIB セクションのbmBitsメンバーは null ではありません。デバイス依存のビットマップ (作成中のものなど) の場合bmBits、ピクセルはメイン メモリではなくビデオ カード上にあるため、 は設定されません。

あなたの例では、ビットに直接アクセスしたい場合は変更CreateCompatibleBitmapする必要があります。CreateDIBSection

于 2012-10-11T04:49:58.600 に答える
10

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

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

フラグを指定する必要があります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
于 2014-08-10T16:28:19.083 に答える
-2

できることの 1 つは、GetObject の戻り値を確認することです。0 の場合、何か問題が発生したことがわかります。呼び出しのパラメーターに問題があります。

于 2014-12-15T09:03:30.460 に答える