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在一些图像尺寸下失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在不下载 Java 的情况下获取网站图像的尺寸?

Opencv:对于非标准尺寸的图像,imdecode() 失败

根据图像尺寸动态居中搜索栏

裁剪图像并将其调整为特定尺寸

Google OR 工具 - 设置时间窗口尺寸失败并出现低级错误

图像聚类的代码和数据集(小尺寸)