1. 程式人生 > >點陣圖4位元組對齊問題

點陣圖4位元組對齊問題

在自己對影象資料進行處理的時候,會有位元組對其的問題,由於之前使用的影象大都是8bit或者是24bit,32bit的影象,使用的對其公式是(pixelwidth*channel+3)/4*4。後面也有看到有些寫法如:(width * bitCounts + 31) / 32 * 4,不是很理解原理。在網上查詢,發現有解釋的非常透澈的,下面借來用用。

1. 首先來自於這樣一個公式:(width * bitCounts / 8 + 3) / 4 * 4,該公式含義比上面的公式要容易理解一些,比如biWidth * biBitCount代表了對齊前每行的總位數,點陣圖有1位、2位、4位、8位、16位、24位、32位等,大於8位的都是8的倍數,所以biWidth * biBitCount / 8是對齊前的總位元組數,要4位元組對齊,除以4,看餘數多少,不夠多少補多少。而因為除以4的餘數只能是0、1、2、3這四種情況,0就是剛好整除不需要再補,1、2、3分別需要補3、2、1個位元組才能湊足4位元組。那麼 我們在除之前先補上3個位元組會是什麼情況呢,對於四種餘數情形,分別是餘3(3+0)、0(3+1)、1(3+2)、2(3+3),對於整數操作(width * bitCounts / 8 + 3) / 4得到的結果不會有餘數,剛好達到了我們需要補足4位元組的目的;另外再考慮能不能先補上別的數字,例如1、2,根據前面餘數情況分析,補1會漏掉餘數為1、2的情況,補2會漏掉餘數為1的情況; 再考慮補上4或者更大數字的情況,餘數為0的情形補4就多了4位元組,數字再往上就更加多餘,所以補上最大餘數剛剛合適。

2. 上面的分析對於位寬大於等於8的點陣圖已經正確,但小於8位的情況,width * bitCounts不一定是8的整數倍,所以我們先不要除以8,而是按照4位元組等於32個bit位來計算,我們看看需要補多少位使得剛好32位對齊,那麼就有公式:(width * bitCounts + n)/ 32 * 4 跟1中的分析方法相同,n應為32的最大餘數31,所以得到最終公式:(width * bitCounts + 31)/ 32 * 4。