StretchDIBits在一些图像尺寸下失败
Posted 好好学习,天天向上
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了StretchDIBits在一些图像尺寸下失败相关的知识,希望对你有一定的参考价值。
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
失败且打印结果为空白页时返回零
原因: 图像宽度是错误的字节数。Windows要求每一行都是4字节的倍数;638*3
是1914,这是2个字节(3是RGB,代表红绿蓝三个字节的像素)
除了行中的最后一个像素,每个像素应该为3个字节。宽度应为1916,而不是1914,因为1916均匀地除以4,而1914则不。
解决方法: 用合适的图像宽度,可以被4整除的
以上是关于StretchDIBits在一些图像尺寸下失败的主要内容,如果未能解决你的问题,请参考以下文章
Opencv:对于非标准尺寸的图像,imdecode() 失败