为什么GetObject返回空bmBits的BITMAP?

上下文:我试图把另一个窗口的截图提供给OpenCV。 我发现在networking上的一些代码应该能够将BITMAP转换为OpenCV可以使用的东西。 不幸的是我遇到了一些麻烦。

问题:为什么bmBits属性/成员始终为空? (我也试过用PrintWindow代替BitBlt,结果是一样的)

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

对于DIB节, bmBits成员是非空的。 对于设备相关的位图(例如您正在创建的位图), bmBits未设置,因为像素位于视频卡上,而不是在主内存中。

在你的例子中,如果你想直接访问这些位,你需要把CreateCompatibleBitmap改成CreateDIBSection

仅供参考。 当从文件加载位图并且想要使用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 

你可以做的一件事是看GetObject的返回值。 如果0,你知道有什么问题。 通话参数有问题。