1

我正在使用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将导致崩溃,因为它试图读取缓冲区的末尾。即便如此,我也不知道如何准确诊断它为什么会这样做,因为它适用于某些尺寸,但不适用于其他尺寸。

4

1 回答 1

5

您的宽度是错误的字节数。Windows 要求每行是 4 字节的倍数;638*3是 1914,这是 2 个字节害羞。

于 2012-12-05T01:42:18.273 回答