調色板(color table)是單色、16色和256色圖像文件所特有的,相對應的調色板大小是2、16和256,調色板以4字節爲單位,每4個字節存放一個顏色值,圖像的數據是指向調色板的索引。
可以將調色板想象成一個數組,每個數組元素的大小爲4字節,假設有一256色的BMP圖像的調色板數據爲:
調色板[0]=黑、調色板[1]=白、調色板[2]=紅、調色板[3]=藍…調色板[255]=黃 |
圖像數據01 00 02 FF表示調用調色板[1]、調色板[0]、調色板[2]和調色板[255]中的數據來顯示圖像顏色。
在早期的計算機中,顯卡相對比較落後,不一定能保證顯示所有顏色,所以在調色板中的顏色數據應儘可能將圖像中主要的顏色按順序排列在前面,位圖信息頭的biClrImportant字段指出了有多少種顏色是重要的。
每個調色板的大小爲4字節,按藍、綠、紅存儲一個顏色值。
打開WINGDI.h文件,搜索"tagRGBTRIPLE"就可以定位到BMP文件的調色板的數據結構定義。
typedef struct tagRGBQUAD { BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; } RGBQUAD; |
表5-4列出了tagRGBTRIPLE中各字段的含義。
表5-4 tagRGBTRIPLE結構
字 段 名 |
大小(單位:字節) |
描 述 |
rgbBlue |
1 |
藍色值 |
rgbGreen |
1 |
綠色值 |
rgbRed |
1 |
紅色值 |
rgbReserved |
1 |
保留,總爲0 |
如果圖像是單色、16色和256色,則緊跟着調色板的是位圖數據,位圖數據是指向調色板的索引序號。
如果位圖是16位、24位和32位色,則圖像文件中不保留調色板,即不存在調色板,圖像的顏色直接在位圖數據中給出。
16位圖像使用2字節保存顏色值,常見有兩種格式:5位紅5位綠5位藍和5位紅6位綠5位藍,即555格式和565格式。555格式只使用了15位,最後一位保留,設爲0。
24位圖像使用3字節保存顏色值,每一個字節代表一種顏色,按紅、綠、藍排列。
32位圖像使用4字節保存顏色值,每一個字節代表一種顏色,除了原來的紅、綠、藍,還有Alpha通道,即透明色。
如果圖像帶有調色板,則位圖數據可以根據需要選擇壓縮與不壓縮,如果選擇壓縮,則根據BMP圖像是16色或256色,採用RLE4或RLE8壓縮算法壓縮。
1:單色圖,調色板中含有兩種顏色,也就是我們通常說的黑白圖片
4:16色圖
8:256色圖,通常說的灰度圖
16:64K圖,一般沒有調色板,圖像數據中每兩個字節表示一個像素,5個或6個位表示一個RGB分量
24:16M真彩色圖,一般沒有調色板,圖像數據中每3個字節表示一個像素,每個字節表示一個RGB分量
32:4G真彩色,一般沒有調色板,每4個字節表示一個像素,相對24位真彩圖而言,加入了一個透明度,即RGBA模式