首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么GetObject会返回bmBits为空的位图?

为什么GetObject会返回bmBits为空的位图?
EN

Stack Overflow用户
提问于 2012-10-11 12:36:48
回答 4查看 6.6K关注 0票数 11

上下文:我正在尝试截取另一个窗口的屏幕截图,以便将其提供给OpenCV。我在网上找到了一些代码,它们应该能够将位图转换为OpenCV可以使用的东西。不幸的是,我遇到了一些麻烦。

问:为什么bmBits属性/成员总是为空?(我也尝试了用PrintWindow而不是BitBlt,结果是一样的)

代码语言:javascript
复制
#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;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-11 12:49:59

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

在您的示例中,如果希望直接访问bits,则需要将CreateCompatibleBitmap更改为CreateDIBSection

票数 18
EN

Stack Overflow用户

发布于 2014-08-11 00:28:19

只是为了提供信息。从文件加载位图并希望使用.bmBits的位图时(适用于glTexImage2DglDrawPixels):

代码语言:javascript
复制
LoadImage(NULL, "path_to.bmp", IMAGE_BITMAP, 0, 0,
                                       LR_LOADFROMFILE);

U必须指定标志LR_CREATEDIBSECTION

代码语言:javascript
复制
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
票数 10
EN

Stack Overflow用户

发布于 2017-12-19 09:21:22

来自MSDN上的文档。请注意第二段。

如果hgdiobj是通过调用CreateDIBSection,创建的位图的句柄,并且指定的缓冲区足够大,则GetObject函数返回DIBSECTION结构。此外,DIBSECTION中包含的BITMAP结构的bmBits成员将包含指向位图的位值的指针。

如果hgdiobj是通过任何其他方式创建的位图的句柄,则GetObject仅返回位图的宽度、高度和颜色格式信息。您可以通过调用GetBitmapBits函数或GetDIBits函数来获取位图的位值。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12832292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档