根据我对该函数的经验,我对GetDiBits有一些疑问。
我错误地创建了一个位图,其大小是我需要的两倍:

HBITMAP hBmpSection = CreateCompatibleBitmap(ScreenDC, 2 * radius, 2 * radius);

我没有注意到,因为代码的下一部分起作用了。
我在该位图的一半上BitBlt屏幕的一部分:
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);

然后我得到了coresponding数组:
GetDIBits(hSectionDC, hBmpSection, 0, bmpSmallInfo.bmiHeader.biHeight, dataBuffer3, &bmpSmallInfo, DIB_RGB_COLORS);

当我将所有这些数据发送到另一台计算机时,图像完全正确(没有黑色边缘出现,因为发送过大的位图时本来就没有)。这意味着GetDiBits将忽略位图的正确大小,并使用BITMAPINFOHEADER中提供的位图而不会崩溃。 (我正在使用Win10。)

这正常吗?因为我不想通过网络发送不需要的字节,所以我不得不问:GetDiBits是否输出一个大小正确的数组:(4 * radius ^ 2)* 3还是从结构中看值: radius ^ 2 * 3-忽略填充-?

最佳答案

基本上,您有这样的代码:

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/height小于max_width/max_height可以吗?

答案是肯定的。 GetDIBits期望dataBuffer3足够大以接收size字节。 width/height应小于或等于max_width/max_height
请注意,BitBlt是此代码中最慢的功能,这是您需要优化的功能。 CreateCompatibleBitmap需要几微秒的时间,创建较大的位图将不会节省很多。

10-08 08:08