Winapi CreateDIBSection以获取屏幕部分的uint8\u t[]

Winapi CreateDIBSection以获取屏幕部分的uint8\u t[],winapi,screenshot,Winapi,Screenshot,我正在尝试获取屏幕部分的uint8\u t[]。左上角的xy坐标为2,3,右下角的xy坐标为17,18 这是我的屏幕顶部30x30像素,带有常规屏幕截图和photoshop裁剪: 通过常规截图和Photoshop裁剪,2,3到17,18截图应该是这样的: 这是我从代码中得到的结果: 我的代码是js ctypes,但没有ctypes错误。这是一个winapi的东西。所以我没有用ctypes标记它,因为它们会混淆。这是我正在使用的简化代码,错误检查等已被删除: c1 = {x:2, y:3}

我正在尝试获取屏幕部分的uint8\u t[]。左上角的xy坐标为2,3,右下角的xy坐标为17,18

这是我的屏幕顶部30x30像素,带有常规屏幕截图和photoshop裁剪:

通过常规截图和Photoshop裁剪,2,3到17,18截图应该是这样的:

这是我从代码中得到的结果:

我的代码是js ctypes,但没有ctypes错误。这是一个winapi的东西。所以我没有用ctypes标记它,因为它们会混淆。这是我正在使用的简化代码,错误检查等已被删除:

c1 = {x:2, y:3} // top left corner
c2 = {x:17, y:18} // bottom right corner

CreateDC('DISPLAY', null, null, null);
nBPP = GetDeviceCaps(hdcScreen, BITSPIXEL);

w = c2.x - c1.x; // width = 15
h = c2.y - c1.y; // height = 15

hdcMemoryDC = CreateCompatibleDC(hdcScreen);

bmi = BITMAPINFO();
bmi.bmiHeader.biSize = BITMAPINFOHEADER.size;
bmi.bmiHeader.biWidth = w;
bmi.bmiHeader.biHeight = -1 * h;
bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = nBPP; // nBPP is 32
bmi.bmiHeader.biCompression = BI_RGB;

hbmp = CreateDIBSection(hdcScreen, &bmi, DIB_RGB_COLORS, (void**)&pixelBuffer, null, 0);

SelectObject(hdcMemoryDC, hbmp);
BitBlt(hdcMemoryDC, 0, 0, w, h, hdcScreen, c1.x, c1.y, SRCCOPY);

为什么部分屏幕位出现错误?如果我进行全屏拍摄,效果很好。

如何绘制图像?当我将
hdcMemoryDC
的内容BitBlt到窗口的HDC时,显示的图像是正确的。非常感谢@LukasThomsen的测试,我将字节数组放入ImageData.data中,然后将其绘制到HTML5画布元素中。因此,如果可能的话,这可能不是C问题,非常感谢您的测试。请尝试
hbmp=CreateCompatibleBitmap(hdcScreen,w,h)
而不是
CreateDIBSection
。您确定nBPP是32而不是24(或16)?如果不是32,那么您的扫描线将不会是DWORD对齐的,这似乎与图示的问题一致。(每像素24位为3字节,宽度为15字节,因此步幅应为45字节,而不是4的倍数。)@Adrianmccarth如果你是对的,则必须为32。我确实是通过
EnumDisplaySettings
中的
DEVMODE.dmBitsPerPel
获得它的。