位图行大小计算

时间:2011-04-23 22:22:38

标签: c++ winapi video bitmap avi

我发现this source效果很好,我只是想问一下这段代码,我不知道:

//calculate total size of RGBQUAD scanlines (DWORD aligned)

    bih.biSizeImage = (((bih.biWidth * 3) + 3) & 0xFFFC) * bih.biHeight ;

我知道为什么有“* 3”,但是没有得到“+3”和与FFFC六进制的按位AND。有人可以解释一下为什么他用这种方式来判断图像的大小吗?

由于

1 个答案:

答案 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)]

我很惊讶代码实际上没有记录这个事实。位杂乱是一件很棒的事情,但看起来很随意。