位图行大小计算

3
我发现这个源码很好用,但是我想问一下这段代码的含义,我不太理解:
//calculate total size of RGBQUAD scanlines (DWORD aligned)

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

我理解为什么会有“*3”,但不明白“+3”和与 FFFC 十六进制的按位与运算。能有人解释一下他为什么要用这种方式计算图像的大小吗?
谢谢。
1个回答

1

如果你尝试使用不同的值,你会发现它实际上是强制将 (width * 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)]

我很惊讶这段代码实际上并没有记录这个事实。位操作是一件很神奇的事情,但它可能看起来非常随意。


考虑到RGBQUAD是一个四字节的结构,现在就有意义了。明白了,谢谢! - Smejki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接