根据我使用此功能的经验,我对 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);
然后我得到对应的数组:
GetDIBits(hSectionDC, hBmpSection, 0, bmpSmallInfo.bmiHeader.biHeight, dataBuffer3, &bmpSmallInfo, DIB_RGB_COLORS);
当我将所有这些数据发送到另一台计算机时,图像完全正确(没有黑色边缘,因为它会在发送过大位图的情况下出现)。这意味着 GetDiBits 会忽略位图的正确大小并使用 BITMAPINFOHEADER 中提供的大小,而不会崩溃。(我用的是Win10。)
这是正常的吗?因为我不想通过网络发送不需要的字节,所以我不得不问:GetDiBits 是否输出正确尺寸大小的数组: (4*radius^2)*3 或者它是否关注结构中的值:半径^2 *3 -忽略填充-?