Здравствуйте, пытаюсь вытянуть из совместного битмапа(полностью заполнен 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); //зарисовываю синей кистью
BITMAPINFO bi = { 0 };
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
int er = GetDIBits(hdcc, bm, 0, 0, NULL, &bi, DIB_RGB_COLORS);
//В GetDIBits в качестве HDC должен же совместный выступать, да?
if (!er)
{
cout << "ERROR HERE:"<< GetLastError()<<"ENDS";
}
COLORREF *buf = new COLORREF(bi.bmiHeader.biSizeImage); \\Так и не понял какого типа должен быть массив - char, BYTE, COLORREF или какой-то ещё
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;
После первого вызова GetDIBits нам становится известны размеры битмапа (хотя тут они известны заранее). Затем можно посчитать размер требуемого буфера (biSizeImage может быть 0 или не совпадать с требуемым размером буфера, если требуемый формат отличается от текущего) и выделить массив. При выделении массива у вас тоже ошибка - вы выделяете только один элемент, инициализируя его значением bi.bmiHeader.biSizeImage.
auto const bitmap_pixels_count{::std::abs(bi.bmiHeader.biWidth * bi.bmiHeader.biHeight)};
COLORREF * buf = new COLORREF[bitmap_pixels_count]; // выделяем массив
Еще отмечу, что Rectangle рисует прямоугольник с обводкой текущим пером.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости