2011-04-23 103 views
3

我发现this source这工作得很好,我只是想请教一下这段代码,我不明白:位图行大小计算

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

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

我明白为什么有“* 3”,但没得到“+3”和按位与FFFC六进制。有人能解释我为什么用这种方法来抠图像的大小吗?

感谢

回答

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

倍数向上取整之间的差异的代码实际上并不记录这个事实。有点捣蛋是件好事,但它看起来很随意。

+0

考虑RGBQUAD是一个四字节结构,它现在有意义。得到它了。谢谢! – Smejki 2011-04-24 01:33:33