上下文:我正在尝试截取另一个窗口的屏幕截图,以便将其提供给OpenCV。我在网上找到了一些代码,它们应该能够将位图转换为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;
}发布于 2017-12-19 09:21:22
来自MSDN上的文档。请注意第二段。
如果hgdiobj是通过调用CreateDIBSection,创建的位图的句柄,并且指定的缓冲区足够大,则GetObject函数返回
DIBSECTION结构。此外,DIBSECTION中包含的BITMAP结构的bmBits成员将包含指向位图的位值的指针。
如果hgdiobj是通过任何其他方式创建的位图的句柄,则GetObject仅返回位图的宽度、高度和颜色格式信息。您可以通过调用GetBitmapBits函数或GetDIBits函数来获取位图的位值。
https://stackoverflow.com/questions/12832292
复制相似问题