位图行大小计算

bitmap row size calculation

本文关键字:计算 位图      更新时间:2023-10-16

我发现这个源代码工作得很好,我只是想问一下我没有得到的这段代码:

//calculate total size of RGBQUAD scanlines (DWORD aligned)
    bih.biSizeImage = (((bih.biWidth * 3) + 3) & 0xFFFC) * bih.biHeight ;

我明白为什么有"*3",但不要得到"+3"和位与FFFC十六进制。有人能解释一下他为什么这样计算图像的大小吗?

谢谢

如果您对不同的值进行尝试,您将看到它实际上迫使(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)]

我很惊讶代码没有实际记录这个事实。摆弄比特是一件美妙的事情,但它可能看起来非常随意。