上下文:我正在尝试截取另一个窗口的屏幕快照,以将其输入到OpenCV中。我在网上找到了一些应该可以将BITMAP转换为OpenCV可以使用的代码的代码。不幸的是我遇到了麻烦。

问题:为什么bmBits属性/成员始终为null? (我也尝试使用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成员不为null。对于与设备有关的位图(例如您要创建的位图),未设置bmBits,因为像素位于视频卡上,而不位于主内存中。

在您的示例中,如果您想直接访问这些位,则需要将CreateCompatibleBitmap更改为CreateDIBSection

关于c++ - 为什么GetObject返回带有空bmBits的BITMAP?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12832292/

10-12 07:14