2011-04-23 100 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