Ошибка StretchDIBits только при определенных размерах изображения

я использую StretchDIBits распечатать изображение, и это не удается, когда изображение имеет определенные размеры по неизвестной причине.

Данные изображения загружаются в массив unsigned int из какого-то другого источника изображения в 24-битном формате BGR. Я уже проверил, что изображение и буфер в порядке, так как, как я уже сказал, он работает при некоторых размерах, но не на всех.

Текущий размер, который я тестирую, — 638×1014. Если я изменю высоту на 1013, она будет работать нормально, но по какой-то причине она просто выпадет, если она будет 1014.

Вот некоторый код, чтобы показать вам, как все это настраивается:

unsigned int * buffer = new unsigned int[width * height * 3];

// Fill buffer with image data...

BITMAPINFOHEADER bi = { 0 };
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = width;
bi.biHeight = height;
bi.biPlanes = 1;
bi.biBitCount = 24;
bi.biCompression = BI_RGB;
bi.biSizeImage = width * height * 3; // Specifying this value because if I don't it will crash trying to read outside of the buffer.

StartPage(hdcPrint);
SetMapMode(hdcPrint, MM_ISOTROPIC);
SetWindowExtEx(hdcPrint, width, height, NULL);
SetViewportExtEx(hdcPrint, width, height, NULL);
SetViewportOrgEx(hdcPrint, 0, 0, NULL);

StretchDIBits(hdcPrint, 0, 0, width, width, 0, 0, width, height, buffer, (BITMAPINFO *) &bi, DIB_RGB_COLORS, SRCCOPY);

StretchDIBits возвращает ноль в случае сбоя, а результат печати — пустая страница.

У меня есть смутное представление о том, в чем проблема, потому что, как говорится в комментарии, если я не укажу biSizeImage и оставить его на нуле, то StretchDIBits вызовет сбой, потому что он пытается прочитать после конца буфера. Несмотря на это, я понятия не имею, как точно диагностировать, почему он это делает, так как он работает в некоторых размерах, но не в других.

1

Решение

Ваша ширина неправильное количество байтов. Windows требует, чтобы каждая строка была кратна 4 байтам; 638*3 1914, что составляет 2 байта.

5

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

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

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