BITMAPV5HEADER越来越RGBA保持在255(BITMAPV5HEADER getting

2019-10-23 00:31发布

我得到下一个屏幕截图的字节数组,这是在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。

Answer 1:

BitBlt的,像几乎所有的GDI函数,不保留Alpha值。

如果你从屏幕块传输,那么所有的阿尔法255 - 屏幕不具有透明度孔。 所以,你可以自己刚刚设置的阿尔法做的blit后。



文章来源: BITMAPV5HEADER getting RGBA keep A at 255