不同BMP位图与调色板分析
調(diào)色板(color table)是單色、16色和256色圖像文件所特有的,相對應的調(diào)色板大小是2、16和256,調(diào)色板以4字節(jié)為單位,每4個字節(jié)存放一個顏色值,圖像的數(shù)據(jù)是指向調(diào)色板的索引。
????? 可以將調(diào)色板想象成一個數(shù)組,每個數(shù)組元素的大小為4字節(jié),假設有一256色的BMP圖像的調(diào)色板數(shù)據(jù)為:
?
| 調(diào)色板[0]=黑、調(diào)色板[1]=白、調(diào)色板[2]=紅、調(diào)色板[3]=藍…調(diào)色板[255]=黃 |
????? 圖像數(shù)據(jù)01 00 02 FF表示調(diào)用調(diào)色板[1]、調(diào)色板[0]、調(diào)色板[2]和調(diào)色板[255]中的數(shù)據(jù)來顯示圖像顏色。
????? 在早期的計算機中,顯卡相對比較落后,不一定能保證顯示所有顏色,所以在調(diào)色板中的顏色數(shù)據(jù)應盡可能將圖像中主要的顏色按順序排列在前面,位圖信息頭的biClrImportant字段指出了有多少種顏色是重要的。
????? 每個調(diào)色板的大小為4字節(jié),按藍、綠、紅存儲一個顏色值。
????? 打開WINGDI.h文件,搜索"tagRGBTRIPLE"就可以定位到BMP文件的調(diào)色板的數(shù)據(jù)結構定義。
| typedef struct tagRGBQUAD { BYTE??? rgbBlue; BYTE??? rgbGreen; BYTE??? rgbRed; BYTE??? rgbReserved; } RGBQUAD; |
????? 表5-4列出了tagRGBTRIPLE中各字段的含義。
????????????????????????????????????????????????????????????????? 表5-4?tagRGBTRIPLE結構
?
| 字??段??名 | 大小(單位:字節(jié)) | 描????述 |
| rgbBlue | 1 | 藍色值 |
| rgbGreen | 1 | 綠色值 |
| rgbRed | 1 | 紅色值 |
| rgbReserved | 1 | 保留,總為0 |
?
????? 如果圖像是單色、16色和256色,則緊跟著調(diào)色板的是位圖數(shù)據(jù),位圖數(shù)據(jù)是指向調(diào)色板的索引序號。
????? 如果位圖是16位、24位和32位色,則圖像文件中不保留調(diào)色板,即不存在調(diào)色板,圖像的顏色直接在位圖數(shù)據(jù)中給出。
??????16位圖像使用2字節(jié)保存顏色值,常見有兩種格式:5位紅5位綠5位藍和5位紅6位綠5位藍,即555格式和565格式。555格式只使用了15位,最后一位保留,設為0。
??????24位圖像使用3字節(jié)保存顏色值,每一個字節(jié)代表一種顏色,按紅、綠、藍排列。
??????32位圖像使用4字節(jié)保存顏色值,每一個字節(jié)代表一種顏色,除了原來的紅、綠、藍,還有Alpha通道,即透明色。
????? 如果圖像帶有調(diào)色板,則位圖數(shù)據(jù)可以根據(jù)需要選擇壓縮與不壓縮,如果選擇壓縮,則根據(jù)BMP圖像是16色或256色,采用RLE4或RLE8壓縮算法壓縮。
?
?
???? 1:單色圖,調(diào)色板中含有兩種顏色,也就是我們通常說的黑白圖片
???? 4:16色圖
???? 8:256色圖,通常說的灰度圖
??? 16:64K圖,一般沒有調(diào)色板,圖像數(shù)據(jù)中每兩個字節(jié)表示一個像素,5個或6個位表示一個RGB分量
??? 24:16M真彩色圖,一般沒有調(diào)色板,圖像數(shù)據(jù)中每3個字節(jié)表示一個像素,每個字節(jié)表示一個RGB分量
??? 32:4G真彩色,一般沒有調(diào)色板,每4個字節(jié)表示一個像素,相對24位真彩圖而言,加入了一個透明度,即RGBA模式
總結
以上是生活随笔為你收集整理的不同BMP位图与调色板分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PPI数据集分析
- 下一篇: vCenter通过vMotion迁移虚拟