Информация о растровом изображении регулярно возвращает серию одних и тех же неправильных значений, прежде чем возвращатC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Информация о растровом изображении регулярно возвращает серию одних и тех же неправильных значений, прежде чем возвращат

Сообщение Anonymous »

и прошу прощения, если проблема, которую я описываю, действительно очевидна. Я новичок в программировании для Windows и использовании GDI+.
Я пишу программу, которая считывает область 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]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»