Я пишу программу, которая читает каждый пиксель окна и сохраняет его в массив байтов как черно-белый, каждый бит байтов является черно-белым значением.
Но GetPixel()
похоже, не работает так, как я ожидал. Вот часть кода для чтения пикселей и их хранения:
byte *colors = new byte[250000 / 8 + 1];
ZeroMemory(colors, 250000 / 8 + 1);
HDC hdc = GetDC(hwnd);
HDC memDC = CreateCompatibleDC(hdc);
HBITMAP memBitmap = CreateCompatibleBitmap(hdc, 500, 500);
SelectObject(memDC, memBitmap);
BitBlt(memDC, 0, 0, 500, 500, hdc, 0, 0, SRCCOPY);
for (int y = 0; y < 500; y++) {
for (int x = 0; x < 500; x++) {
COLORREF pxcolor = GetPixel(memDC, x, y);
if (pxcolor == CLR_INVALID) {
MessageBox(hwnd, _T("Oops..."), NULL, NULL);
}
int r = GetRValue(pxcolor);
int g = GetGValue(pxcolor);
int b = GetBValue(pxcolor);
int average = (r + g + b) / 3;
bool colorBW = average >= 128;
int currentIndex = y * 500 + x;
if (colorBW) {
SetBit(colors, currentIndex);
}
}
}
ReleaseDC(hwnd, hdc);
DeleteDC(memDC);
DeleteObject(memBitmap);
delete[] colors;
SetBit()
:
inline VOID SetBit(byte *bytes, int index, bool state = true) {
byte byteToSet = bytes[index / 8];
int bitNumber = index % 8;
bytes[index / 8] = state ? (byteToSet | (0b1000'0000 >> bitNumber)) : (byteToSet & ((0b1111'1111 >> (bitNumber + 1)) | (0b1111'1111 << (8 - bitNumber - 1))));
}
Каждый пиксель прочитан GetPixel()
кажется, дает мне 0x000000, или чисто черный.
Мой код использовал к вызов GetPixel()
с первым параметром hdc
без всякого растрового изображения и памяти DC, но так каждый пиксель возвращается CLR_INVALID
, Я наткнулся этот вопрос, и приведенный выше код после того, как я изменил его на использование DC памяти и растровых изображений. Но это просто пошло с возвращением CLR_INVALID
в 0x000000
за каждый пиксель.
Если я добавлю эту строку, прежде чем использовать GetPixel()
:
SetPixel(memDC, x, y, RGB(255, 255, 255));
GetPixel()
возвращает правильный результат. Почему это так работает?
Задача ещё не решена.
Других решений пока нет …