【发布时间】:2018-08-09 19:36:08
【问题描述】:
我正在尝试从兼容位图(完全由RGB(0,0,255) 颜色填充)到GetDIBits 获取像素数组,但它返回另一种颜色。而且,当我尝试更改数组时,它实际上返回了一个异常。怎么了?
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;
【问题讨论】:
-
sizeof(bi.bmiHeader);的结果是什么?可能需要打包它。 -
"但它返回另一种颜色" -- 什么颜色? “返回异常” -- 什么异常?来吧,不要让我们通过猜测浪费时间。
-
@chux,它返回 40
-
@ArturKlochko 见bmp,我预计是14。可能需要发布
BITMAPINFO定义并提供minimal reproducible example 的其他详细信息 -
看看你对“新”的调用。看出什么不对了吗?比如可能使用括号而不是方括号?