上下文:我试图把另一个窗口的截图提供给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 (对于glTexImage2D , glDrawPixels )时:
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,你知道有什么问题。 通话参数有问题。