我发现这个来源很好用,我只想问一下我没有得到的这段代码:
//calculate total size of RGBQUAD scanlines (DWORD aligned)
bih.biSizeImage = (((bih.biWidth * 3) + 3) & 0xFFFC) * bih.biHeight ;
我明白为什么有“*3”,但没有得到“+3”和FFFC hexa的按位与。有人可以解释一下为什么他以这种方式计算图像的大小吗?
谢谢
如果您尝试使用各种值,您会发现它实际上迫使 (width * 3) 向上舍入到包含它的 4 的最小倍数。他可能这样做是为了强制使事物保持 32 位对齐。
使用蟒蛇:
>>> f = lambda x: ((x * 3) + 3) & 0xFFFC
>>> [f(x) for x in range(1, 20)]
[4, 8, 12, 12, 16, 20, 24, 24, 28, 32, 36, 36, 40, 44, 48, 48, 52, 56, 60]
下面显示了直接乘法和向上舍入到 4 的倍数之间的区别
>>> [(3*x, f(x)) for x in range(1, 8)]
[(3, 4), (6, 8), (9, 12), (12, 12), (15, 16), (18, 20), (21, 24)]
我很惊讶代码实际上并没有记录这个事实。玩弄比特是一件很棒的事情,但它看起来很随意。