我发现this source效果很好,我只是想问一下这段代码,我不知道:
//calculate total size of RGBQUAD scanlines (DWORD aligned)
bih.biSizeImage = (((bih.biWidth * 3) + 3) & 0xFFFC) * bih.biHeight ;
我知道为什么有“* 3”,但是没有得到“+3”和与FFFC六进制的按位AND。有人可以解释一下为什么他用这种方式来判断图像的大小吗?
由于
答案 0 :(得分:1)
如果您尝试使用各种值,您会看到它实际上强制(宽度* 3)向上舍入到包含它的4的最小倍数。他可能会这样做以强制执行32位对齐。
使用python:
>>> 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)]
我很惊讶代码实际上没有记录这个事实。位杂乱是一件很棒的事情,但看起来很随意。