я использую 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
вызовет сбой, потому что он пытается прочитать после конца буфера. Несмотря на это, я понятия не имею, как точно диагностировать, почему он это делает, так как он работает в некоторых размерах, но не в других.
Ваша ширина неправильное количество байтов. Windows требует, чтобы каждая строка была кратна 4 байтам; 638*3
1914, что составляет 2 байта.
Других решений пока нет …