我正在尝试使用带有CreateDIBSection的BITMAPV5HEADER来获取RGBA形式的uint8 []。我是从ctypes做这个,但这不是一个ctypes问题,但我会发布代码,所以你可以看到它。 ctypes家伙不知道这里有什么东西,这是一个winapi的东西。
我仔细检查了我的struct,function和type声明,但是在调用CreateDIBSection
之后,我一直得到87的GetLastError,这是无效的参数。如果我将bv5Size设置为BITMAPINFOHEADER
的大小40
它可以工作但被视为BITMAPINFO标题,而红色,蓝色,绿色,alpha蒙版不会影响它,因为我仍然得到BGRA。< / p>
"ostypes.TYPE.BITMAPINFOHEADER.size:" 40
"ostypes.TYPE.BITMAPV5HEADER.size:" 124
这是我的ctypes代码,只是为了表明一切都是正确的:
var bmi = ostypes.TYPE.BITMAPV5HEADER();
bmi.bV5Size = ostypes.TYPE.BITMAPV5HEADER.size;
bmi.bV5Width = nWidth; //w;
bmi.bV5Height = -1 * nHeight; //-1 * h; // top-down
bmi.bV5Planes = 1;
bmi.bV5BitCount = nBPP; //32;
bmi.bV5Compression = ostypes.CONST.BI_BITFIELDS;
bmi.bV5RedMask = ostypes.TYPE.DWORD('0x00FF0000');
bmi.bV5GreenMask = ostypes.TYPE.DWORD('0x0000FF00');
bmi.bV5BlueMask = ostypes.TYPE.DWORD('0x000000FF');
bmi.bV5AlphaMask = ostypes.TYPE.DWORD('0xFF000000'); // 0x00000000 for opaque, otherwise 0xff000000
var cBmi = ctypes.cast(bmi.address(), ostypes.TYPE.BITMAPINFO.ptr); // cBmi is now a pointer so no need to pass cBmi.address() to CreateDIBSection
var pixelBuffer = ostypes.TYPE.BYTE.ptr();
var hbmp = ostypes.API('CreateDIBSection')(hdcMemoryDC, cBmi, ostypes.CONST.DIB_RGB_COLORS, pixelBuffer.address(), null, 0);
这是ctypes所以我不需要在创建后memset bmi,因为默认情况下它是初始化的memset 0。
由于