StretchDIBits仅在特定图像维度失败
StretchDIBits failing only at specific image dimensions
我正在使用StretchDIBits
打印图像,当图像由于某种未知原因而处于特定大小时,它将失败。
图像数据以24位BGR格式从一些其他图像源加载到无符号int数组中。我已经验证了图像和缓冲区非常好,因为正如我所说,它可以在某些大小下工作,但根本不能。
我正在测试的当前尺寸是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个字节。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 视图中的参数推导失败:take_while
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- 获取AIMAGE_FORMAT_JPEG的图像失败
- StretchDIBits仅在特定图像维度失败
- SFML图像加载在发布版本上失败 - 文件名损坏
- OpenCV,dlib - 函数中的图像类型转换失败;在外面工作
- 我正在尝试将灰度转换为更大的黑色图像.我得到这个错误OpenCV错误:断言失败
- CImg:图像二值化结果失败
- 从资源加载图像失败
- 使用鼠标单击在图像上绘制多条线失败
- 复制图像后,断言失败(大小>宽度0 &&&大小.高度>0)