我通过以下方式获取屏幕截图的字节数组,这是在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形式(由于ctypes的性能原因,它在C方面很重要。)
所以现在我们可以通过使用这些蒙版成功地将它变成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格式,但是将A值保持在255.
答案 0 :(得分:1)
与几乎所有GDI函数一样,BitBlt不会保留alpha值。
如果您从屏幕上进行blitting,那么所有alpha都是255 - 屏幕没有透明孔。所以你可以在做blit后自己设置alpha。