我得到下一个屏幕截图的字节数组,这是在ctypes的完成,没有与ctypes的没有任何问题,如果我给这一个ctypes标记人会混淆了ctypes的,所以我简化了所有的错误检查等向您展示的过程。
CreateDC('DISPLAY', null, null, null);
nWidth = GetDeviceCaps(hdcScreen, HORZRES); // 1280 // numbers are always divisilbe by 4
nHeight = GetDeviceCaps(hdcScreen, ostypes.CONST.VERTRES); // 1024
nBPP = GetDeviceCaps(hdcScreen, BITSPIXEL); // 32
hdcMemoryDC = ostypes.API('CreateCompatibleDC')(hdcScreen);
bmi = BITMAPV5HEADER();
bmi.bV5Size = BITMAPV5HEADER.size;
bmi.bV5Width = nWidth;
bmi.bV5Height = -1 * nHeight; // top-down
bmi.bV5Planes = 1;
bmi.bV5BitCount = nBPP;
bmi.bV5Compression = BI_BITFIELDS;
bmi.bV5RedMask = 0xff;
bmi.bV5GreenMask = 0xff00;
bmi.bV5BlueMask = 0xff0000;
bmi.bV5AlphaMask = 0xff000000;
cBmi = ctypes.cast(bmi.address(), BITMAPINFO.ptr);
pixelBuffer = BYTE.ptr();
hbmp = CreateDIBSection(hdcScreen, cBmi, DIB_RGB_COLORS, pixelBuffer.address(), null, 0);
SelectObject(hdcMemoryDC, hbmp);
BitBlt(hdcMemoryDC, 0,0, nWidth, nHeight, hdcScreen, 0, 0, SRCCOPY);
byteArr = ctypes.cast(pixelBuffer, BYTE.array(arrLen).ptr).contents;
因此,与上述的标志,我收到了BGRA byteArr看起来像这样:
array(5242880)([240, 200, 105, 255, ..... ])
因此,B是240,G为200,R为105,且A为255。
我想进入一个RGBA形式是(这是重要的它是在C面做了ctypes的性能的原因)。
所以,现在我们可以成功地让它进入RGBA形式然而,A变为0,通过使用这些面具:
bmi.bV5RedMask = 0xff0000;
bmi.bV5GreenMask = 0xff00;
bmi.bV5BlueMask = 0xff;
bmi.bV5AlphaMask = 0xff000000; // we also tried 0x00000000
现在,这给了我们:
array(5242880)([105, 200, 240, 0, ..... ])
所以问题是A值将会为0,我怎么能保持这种RGBA格式,但保留的值255。