gpt4 book ai didi

c++ - StretchDIBits 仅在特定图像尺寸下失败

转载 作者:可可西里 更新时间:2023-11-01 11:13:25 26 4
gpt4 key购买 nike

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

最佳答案

你的宽度是错误的字节数。 Windows 要求每一行都是 4 字节的倍数; 638*3 是 1914,少了 2 个字节。

关于c++ - StretchDIBits 仅在特定图像尺寸下失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13714911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com