BMP位圖調色板說明
- 2020 年 10 月 25 日
- 筆記
- BMP, Image Processing
網上一搜,可以看到BMP位圖結構的詳細說明,這篇文章專門談一下其中的調色板。
多少位位圖並不是指每一個顏色該用多少位表示,對於顏色來說,它始終都是24位(RGB),或者是32位(RGBA),而是指該位圖每個像素點用多少位表示,若是n位位圖,則該位圖每個像素點用n位表示,該位圖共有2n種顏色(對應於調色板的顏色索引)。對於小於24位的位圖,一個像素點所用的位數不足以表示一個顏色,所以要用調色板,而每一像素所用的位數存放的是對應於調色板的索引,所以有多少位就能表示2n種顏色;
比如:有一個長寬各為200個象素,顏色數為16色的彩色圖,每一個象素都用R,G,B三個分量表示,因為每個分量有256個級別,要用8位(bit),即一個位元組(byte)來表示,所以每個象素需要用3個位元組。整個圖象要用200*200*3,約120k位元組,可不是一個小數目呀!
如果我們用下面的方法,就能省的多。 因為是一個16色圖,也就是說這幅圖中最多只有16種顏色,我們可以用一個表:表中的每一行記錄一種顏色的R,G,B值。這樣當我們表示一個象素的顏色時,只需要指出該顏色是在第幾行,即該顏色在表中的索引值。舉個例子,如果表的第0行為255,0,0(紅色),那麼當某個象素為色時,只需要標明0即可。 讓我們再來計算一下:16種狀態可以用4位(bit)表示,所以一個象素要用半個位元組。整個圖象要用200*200*0.5,約20k位元組,再加上表佔用的位元組為3*16=48位元組。整個佔用的位元組數約為前面的1/6,省很多吧。
這張RGB的表,即是我們常說的調色板(Palette),另一種叫法是顏色查找表LUT(LookUpTable),似乎更確切一些。
若對於24位或32位位圖,它就不需要調色板了,因為24位足可以放對應的顏色值了,每個位元組對應於R,G,B分量的值。
計算每行像素所佔位元組數:
#define BYTE_PER_LINE(width, bitCount) ((((width)*(bitCount)+31)/32)*4)
其中width是每行像素數,bitCount是每個像素所佔的位數,為什麼要乘以4除以32呢?因為Windows規定圖像文件中一個掃描行所佔的位元組數必須是4的倍數(即以字為單位,1個字4個位元組),不足的以0填充,乘以4保證是4的倍數,除以32保證實際位元組數不變(即實際除以8,一個位元組是8位),加31是為了多餘的整數不夠32除另外加的。