首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetDIBits返回兼容位图的无效颜色数组

GetDIBits返回兼容位图的无效颜色数组
EN

Stack Overflow用户
提问于 2018-03-02 00:46:33
回答 1查看 105关注 0票数 0

我试图通过GetDIBits从兼容的位图(它完全由RGB(0,0,255)颜色填充)中获取像素数组,但它返回了另一种颜色。而且,当我试图改变一个数组时,它实际上返回了一个异常。怎么啦?

代码语言:javascript
复制
case WM_PAINT:
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);
    HBRUSH hb = CreateSolidBrush(RGB(0, 0, 255));

    HDC hdcc = CreateCompatibleDC(hdc);
    HBITMAP bm = CreateCompatibleBitmap(hdc, r.right, r.bottom);

    SelectObject(hdcc, bm);
    SelectObject(hdcc, hb);

    Rectangle(hdcc, 0, 0, r.right, r.bottom); //filling by the blue brush

    BITMAPINFO bi = { 0 };

    bi.bmiHeader.biSize = sizeof(bi.bmiHeader);

    int er = GetDIBits(hdcc, bm, 0, 0, NULL, &bi, DIB_RGB_COLORS);
    //In GetDIBits, as HDC argument must be compatible, yes?

    if (!er)
    {
        cout << "ERROR HERE:"<< GetLastError()<<"ENDS";
    }

    COLORREF *buf = new COLORREF(bi.bmiHeader.biSizeImage); //Yet, still, I have not understood, which type array should be - char, BYTE, COLORREF or anything else

    bi.bmiHeader.biBitCount = 32;
    bi.bmiHeader.biCompression = BI_RGB;
    bi.bmiHeader.biHeight = abs(bi.bmiHeader.biHeight);

    GetDIBits(hdcc, bm, 0, bi.bmiHeader.biHeight, buf, &bi, DIB_RGB_COLORS);

    for (int i(0); i < 100; i++)
    {
        cout << (int)GetRValue(buf[i]) << ",";
        cout << (int)GetGValue(buf[i]) << ",";
        cout << (int)GetBValue(buf[i]) << ",";
        cout << endl;
    }

    SetDIBits(hdcc, bm, 0, bi.bmiHeader.biHeight, buf, &bi, DIB_RGB_COLORS);

    delete []buf;

    BitBlt(hdc, 0, 0, r.right, r.bottom, hdcc, 0, 0, SRCCOPY);

    DeleteObject(hb);
    DeleteDC(hdcc);
    DeleteObject(bm);

    EndPaint(hwnd, &ps);
}
break;

enter image description here

EN

回答 1

Stack Overflow用户

发布于 2018-03-02 02:19:50

这一行有几个问题:

代码语言:javascript
复制
COLORREF *buf = new COLORREF(bi.bmiHeader.biSizeImage);

正如@PaulMcKenzie指出的那样,你的意思是使用方括号而不是圆括号,这样你为array.

  • biSizeImage分配的空间是以字节为单位的,而不是COLORREFs,所以这个over-allocates.

  • biSizeImage可能是零,在这种情况下你什么都不会分配。当biSizeImage为零时,意味着您必须计算程序中这一点的实际大小,biSizeImage是设备相关(“兼容”)位图的大小,它很可能与您试图获取的设备无关数据所需的大小不同。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49054698

复制
相关文章

相似问题

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