我正在使用StretchDIBits
打印图像,并且由于某种未知原因图像处于特定尺寸时它会失败。
图像数据以 24 位 BGR 格式从其他一些图像源加载到无符号整数数组中。我已经验证了图像和缓冲区非常好,因为就像我说的那样,它可以在某些尺寸下工作,但根本不行。
我正在测试的当前尺寸是 638x1014。如果我将高度更改为 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
将导致崩溃,因为它试图读取缓冲区的末尾。即便如此,我也不知道如何准确诊断它为什么会这样做,因为它适用于某些尺寸,但不适用于其他尺寸。