Я пишу программу, которая считывает область n*n на экране и отправляет полученные пиксели в 2D-вектор для дальнейшего использования. расчеты. Я продумывал вектор, чтобы иметь возможность сопоставить его с версией изображения, чтобы убедиться, что он получает правильные данные, в основном только для целей отладки. Обычно это работает, но время от времени я получаю одну и ту же последовательность нечетных значений: вектор, полный c0c0c, вектор, полный c0c0c, вектор, полный 0, и, наконец, вектор, полный случайных значений. После этого запуск программы возвращает правильные значения растрового изображения.
Ниже приведена упрощенная версия моего кода без сохранения изображения и прочего:
Код: Выделить всё
#include
#include
#include
#include
#include
#include
using namespace Gdiplus;
using std::cout;
BITMAPINFOHEADER createBitmapHeader(int w, int h) {
BITMAPINFOHEADER bi = { 0 };
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = w;
bi.biHeight = -h;
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
return bi;
}
HBITMAP screenCap(HWND hWnd, unsigned int x, unsigned int y, int gridSize) {
if (gridSize % 2 == 0) {
gridSize++;
}
HDC hwinDC = GetDC(hWnd);
HDC hwinCDC = CreateCompatibleDC(hwinDC);
SetStretchBltMode(hwinCDC, COLORONCOLOR);
int capx = x - (gridSize - 1) / 2;
int capy = y - (gridSize - 1) / 2;
HBITMAP hbwin = CreateCompatibleBitmap(hwinDC, gridSize, gridSize);
BITMAPINFOHEADER bi = createBitmapHeader(gridSize, gridSize);
SelectObject(hwinCDC, hbwin);
DWORD dwBmpSize = ((gridSize * bi.biBitCount + 31) / 32) * 4 * gridSize;
HANDLE hDIB = GlobalAlloc(GHND, dwBmpSize);
int* lpbitmap = (int*)GlobalLock(hDIB);
std::vector refGrid;
refGrid.resize(gridSize);
for (int i = 0; i < refGrid.size(); i++) {
refGrid[i].resize(gridSize);
}
StretchBlt(hwinCDC, 0, 0, gridSize, gridSize, hwinDC, capx, capy, gridSize, gridSize, SRCCOPY);
GetDIBits(hwinCDC, hbwin, 0, gridSize, lpbitmap, (BITMAPINFO*)&bi, DIB_RGB_COLORS);
for (int i = 0; i < refGrid.size(); i++) {
for (int j = 0; j < refGrid.size(); j++) {
refGrid.at(i).at(j) = lpbitmap[i * refGrid.size() + j] - 0xff000000;
}
}
for (int i = 0; i < refGrid.size(); i++) {
for (int j = 0; j < refGrid.size(); j++) {
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/78704827/bitmap-info-regularly-returns-series-of-same-wrong-values-before-returning-corre[/url]