BITMAPV5HEADER尺寸?

时间:2015-05-06 08:19:06

标签: winapi

我正在尝试使用带有CreateDIBSection的BITMAPV5HEADER来获取RGBA形式的uint8 []。我是从ctypes做这个,但这不是一个ctypes问题,但我会发布代码,所以你可以看到它。 ctypes家伙不知道这里有什么东西,这是一个winapi的东西。

我仔细检查了我的struct,function和type声明,但是在调用CreateDIBSection之后,我一直得到87的GetLastError,这是无效的参数。如果我将bv5Size设置为BITMAPINFOHEADER的大小40它可以工作但被视为BITMAPINFO标题,而红色,蓝色,绿色,alpha蒙版不会影响它,因为我仍然得到BGRA。< / p>

所以我想知道32位和64位BITMAPV5HEADER的尺寸应该是多少。对我来说,我得到了124:

"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。

由于

0 个答案:

没有答案