首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetDiBits:在BITMAPINFOHEADER中传递的不同尺寸

GetDiBits:在BITMAPINFOHEADER中传递的不同尺寸
EN

Stack Overflow用户
提问于 2018-04-14 12:58:09
回答 2查看 339关注 0票数 3

根据我对这个函数的经验,我有一些关于GetDiBits的问题。我错误地创建了一个位图,它是我所需大小的两倍:

代码语言:javascript
复制
HBITMAP hBmpSection = CreateCompatibleBitmap(ScreenDC, 2 * radius, 2 * radius);

我没有注意到,因为代码的下一部分起作用了。我在这个位图的一半上BitBlt屏幕的一个部分:

代码语言:javascript
复制
bmpSmallInfo.bmiHeader.biHeight = (2*radius / 2);
bmpSmallInfo.bmiHeader.biWidth = (2*radius / 2);
BitBlt(hSectionDC, 0, 0, bmpSmallInfo.bmiHeader.biWidth, bmpSmallInfo.bmiHeader.biHeight, ScreenDC, 0, 0, SRCCOPY);

然后,我得到了协同响应数组:

代码语言:javascript
复制
GetDIBits(hSectionDC, hBmpSection, 0, bmpSmallInfo.bmiHeader.biHeight, dataBuffer3, &bmpSmallInfo, DIB_RGB_COLORS);

当我将所有这些数据发送到另一台计算机时,图像是完全正确的(如果已经发送了超大的位图,则周围没有黑色的边缘)。这意味着GetDiBits忽略位图的正确大小,并使用BITMAPINFOHEADER中提供的位图,而不会崩溃。(我在使用Win10。)

这是正常的吗?由于我不想通过网络发送不想要的字节,所以我不得不问: GetDiBits是否输出一个大小与正确维度大小相同的数组:(4* radius^2 )*3,还是它处理结构中的值:radius^2 *3 -ignoring填充-?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-14 16:40:22

基本上你有这样的代码:

代码语言:javascript
复制
hbitmap = CreateCompatibleBitmap(hdc, max_width, max_height);
oldbmp = (HBITMAP)SelectObject(memdc, hbitmap);
BitBlt(memdc, 0, 0, width, height, hdc, x, y, SRCCOPY);
SelectObject(memdc, oldbmp);
int size = width_in_bytes_with_padding * height;
allocate size count memory ...
BITMAPINFOHEADER bi = { 40, width, height, 1, 24, BI_RGB };
GetDIBits(...);

你似乎要问的问题是:如果width/heightmax_width/max_height小,行吗?

答案是肯定的。GetDIBits期望dataBuffer3足够大以接收size字节。width/height应小于或等于max_width/max_height

注意,BitBlt是这段代码中最慢的函数,这是您需要优化的。CreateCompatibleBitmap只需几微秒,创建一个更大的位图就不会节省多少。

票数 1
EN

Stack Overflow用户

发布于 2018-04-15 15:14:14

按照GDI标准,GetDIBits是一个相当奇怪的函数。与通常只接受HDCHBITMAP的模式不同,它希望两者兼得,并对HBITMAP参数施加额外的限制。当您要求GDI (潜在地)转换相对于颜色表的位图(即在8位或更低的图像中,应该在HDC中有一个选定的HDC)时,就会使用这个模式。

但是,MSDN上的GetDIBits函数页面非常清楚-- LPBITMAPINFO参数是:

指向BITMAPINFO结构的指针,该结构指定DIB数据的所需格式。

随后的注释说明,如果lpvBits为NULL,则可以通过将位图属性写入BITMAPINFO结构来使用GetDIBits检索位图属性。

要回答您的具体问题,GetDIBits将使用您在BITMAPINFOHEADER中提供的维度和格式输出到dataBuffer,如果DDB有不同的维度或像素格式,将根据需要进行剪辑和转换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49831700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档