DataSizePerLine= (biWidth* biBitCount+31)/8,是個啥意思呢?

pamxy發表於2013-03-22

DataSizePerLine= (biWidth* biBitCount+31)/8即DataSizePerLine= (biWidth* biBitCount+31)/32*4

轉自:http://blog.163.com/flybood@126/blog/static/41230911201041242942824/

點陣圖資料記錄了點陣圖的每一個畫素值或該對應畫素的顏色表的索引值,影象記錄順序是在掃描行內是從左到右,掃描行之間是從下到上。這種格式我們又稱為Bottom_Up點陣圖,當然與之相對的還有Up_Down形式的點陣圖,它的記錄順序是從上到下的,對於這種形式的點陣圖,也不存在壓縮形式。點陣圖的一個畫素值所佔的位元組數:當biBitCount=1時,8個畫素佔1個位元組;當biBitCount=4時,2個畫素佔1個位元組;當biBitCount=8時,1個畫素佔1個位元組;當biBitCount=24時,1個畫素佔3個位元組,此時影象為真彩色影象。當影象不是為真彩色時,影象檔案中包含顏色表,點陣圖的資料表示對應畫素點在顏色表中相應的索引值,當為真彩色時,每一個畫素用三個位元組表示影象相應畫素點彩色值,每個位元組分別對應R、G、B分量的值,這時候影象檔案中沒有顏色表。上面我已經講過了,Windows規定影象檔案中一個掃描行所佔的位元組數必須是4的倍數(即以字為單位),不足的以0填充,影象檔案中一個掃描行所佔的位元組數計算方法:
DataSizePerLine= (biWidth* biBitCount+31)/8;// 一個掃描行所佔的位元組數

主要是這句話:
當biBitCount=1時,8個畫素佔1個位元組;當biBitCount=4時,2個畫素佔1個位元組;當biBitCount=8時,1個畫素佔1個位元組;當biBitCount=24時,1個畫素佔3個位元組
也就是說,一個畫素所佔的位元組數是biBitCount/8 

1Byte = 8Bits  想得到的就是BYTES嘛,但是計算中間單位是4Bytes,這個明白吧?就是說即使是1Bits也作為4Bytes來看待,因為是“大於或等於biWidth的,離4最近的整倍數”嘛。 4Bytes的單位,就是32Bits的單位,所以,讓它除以32就得到了當下的4的整倍數,但是,如果有餘數就必須給結果再增加1,既然這樣,不如在做除法之前就把它加進去,這樣,給bits加上31,確保只要有餘數,結果就會加1。最後要得到Bytes值,需要給這個中間單位再*4.

相關文章