winapi — GetPixel () работает некорректно

Я пишу программу, которая читает каждый пиксель окна и сохраняет его в массив байтов как черно-белый, каждый бит байтов является черно-белым значением.

Но 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() возвращает правильный результат. Почему это так работает?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]