位圖格式 BMP是bitmap的縮寫形式,bitmap顧名思義,就是位圖也即Windows位圖。它一般由4部分組成:文件頭信息塊、圖像描述信息塊、顏色表(在真彩色模式無顏色表)和圖像數(shù)據(jù)區(qū)組成。在系統(tǒng)中以BMP為擴(kuò)展名保存?! ?/p>
打開Windows的畫圖程序,在保存圖像時,可以看到三個選項(xiàng):2色位圖(黑白)、16色位圖、256色位圖和24位位圖?!?/p>
現(xiàn)在講解BMP的4個組成部分:
1.文件頭信息塊
0000-0001 :文件標(biāo)識,為字母ASCII碼“BM”。
0002-0005 :文件大小。
0006-0009 :保留,每字節(jié)以“00”填寫。
000A-000D :記錄圖像數(shù)據(jù)區(qū)的起始位置。各字節(jié)的信息含義依次為:文件頭信息塊大小,圖像描述信息塊的大小,圖像顏色表的大小,保留(為01)。
2.圖像描述信息塊
000E-0011:圖像描述信息塊的大小,常為28H。
0012-0015:圖像寬度。
0016-0019:圖像高度。
001A-001B:圖像的plane總數(shù)(恒為1)。
001C-001D:記錄像素的位數(shù),很重要的數(shù)值,圖像的顏色數(shù)由該值決定。
001E-0021:數(shù)據(jù)壓縮方式(數(shù)值位0:不壓縮;1:8位壓縮;2:4位壓縮)。
0022-0025:圖像區(qū)數(shù)據(jù)的大小。
0026-0029:水平每米有多少像素,在設(shè)備無關(guān)位圖(.DIB)中,每字節(jié)以00H填寫。
002A-002D:垂直每米有多少像素,在設(shè)備無關(guān)位圖(.DIB)中,每字節(jié)以00H填寫。
002E-0031:此圖像所用的顏色數(shù),如值為0,表示所有顏色一樣重要。
3.顏色表
顏色表的大小根據(jù)所使用的顏色模式而定:2色圖像為8字節(jié);16色圖像位64字節(jié);256色圖像為1024字節(jié)。其中,每4字節(jié)表示一種顏色,并以B(藍(lán)色)、G(綠色)、R(紅色)、alpha(32位位圖的透明度值,一般不需要)。即首先4字節(jié)表示顏色號0的顏色,接下來表示顏色號1的顏色,依此類推。
4.圖像數(shù)據(jù)區(qū)
顏色表接下來位是位圖文件的圖像數(shù)據(jù)區(qū),在此部分記錄著每點(diǎn)像素對應(yīng)的顏色號,其記錄方式也隨顏色模式而定,既2色圖像每點(diǎn)占1位;16色圖像每點(diǎn)占4位;256色圖像每點(diǎn)占8位;真彩色圖像每點(diǎn)占24位。所以,整個數(shù)據(jù)區(qū)的大小也會隨之變化。究其規(guī)律而言,可的出如下計算公式:圖像數(shù)據(jù)信息大小=(圖像寬度*圖像高度*記錄像素的位數(shù))/8。 然而,未壓縮的圖像信息區(qū)的大小。除了真彩色模式外,其余的均大于或等于數(shù)據(jù)信息的大小。這是為什么呢?原因有兩個:
1. BMP文件記錄一行圖像是以字節(jié)為單位的。因此,就不存在一個字節(jié)中的數(shù)據(jù)位信息表示的點(diǎn)在不同的兩行中。也就是說,設(shè)顯示模式位16色,在每個字節(jié)分配兩個點(diǎn)信息時,如果圖像的寬度位奇數(shù),那么最后一個像素點(diǎn)的信息將獨(dú)占一個字節(jié),這個字節(jié)的后4位將沒有意義。接下來的一個字節(jié)將開始記錄下一行的信息。
2. 為了顯示的方便,除了真彩色外,其他的每中顏色模式的行字節(jié)數(shù)要用數(shù)據(jù)“00”補(bǔ)齊為4的整數(shù)倍。如果顯示模式為16色,當(dāng)圖像寬為19時,存儲時每行則要補(bǔ)充4-(19/2+1)%4=2個字節(jié)(加1是因?yàn)槔锩嬗幸粋€像素點(diǎn)要獨(dú)占了一字節(jié))。如果顯示模式為256色,當(dāng)圖像寬為19時,每行也要補(bǔ)充4-19%4=1個字節(jié)。
bmp文件大體上分成四個部分。
位圖文件頭BITMAPFILEHEADER 、位圖信息頭BITMAPINFOHEADER 、調(diào)色板Palette 、實(shí)際的位圖數(shù)據(jù)ImageDate
第一部分為位圖文件頭BITMAPFILEHEADER,是一個結(jié)構(gòu),其定義如下:
typedef unsigned char BYTE
typedef unsigned short WORD
typedef unsigned long DWORD
typedef struct tagBITMAPFILEHEADER {
WORD bfType; //類型名,必須是0x424D,即字符串“BM”,
DWORD bfSize; //文件大小
WORD bfReserved1; //保留字,不考慮
WORD bfReserved2; //保留字,同上
DWORD bfOffBits; //實(shí)際位圖數(shù)據(jù)的偏移字節(jié)數(shù),即前三個部分長度之和
} BITMAPFILEHEADER;
第二部分為位圖信息頭BITMAPINFOHEADER,也是一個結(jié)構(gòu),其定義如下:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; //指定此結(jié)構(gòu)體的長度,為40
LONG biWidth; //位圖寬
LONG biHeight; //位圖高
WORD biPlanes; //平面數(shù),為1
WORD biBitCount //采用顏色位數(shù),可以是1,2,4,8,16,24,新的可以是32
DWORD biCompression; //壓縮方式,可以是0,1,2,其中0表示不壓縮
DWORD biSizeImage; //實(shí)際位圖數(shù)據(jù)占用的字節(jié)數(shù)
LONG biXPelsPerMeter; //X方向分辨率
LONG biYPelsPerMeter; //Y方向分辨率
DWORD biClrUsed; //使用的顏色數(shù),如果為0,則表示默認(rèn)值(2^顏色位數(shù))
DWORD biClrImportant; //重要顏色數(shù),如果為0,則表示所有顏色都是重要的
} BITMAPINFOHEADER;
第三部分為調(diào)色板Palette,當(dāng)然,這里是對那些需要調(diào)色板的位圖文件而言的。24位和32位是不需要調(diào)色板的。
typedef struct tagRGBQUAD {
BYTE rgbBlue; //該顏色的藍(lán)色分量
BYTE rgbGreen; //該顏色的綠色分量
BYTE rgbRed; //該顏色的紅色分量
BYTE rgbReserved; //保留值
} RGBQUAD;
第四部分就是實(shí)際的圖象數(shù)據(jù)了。對于用到調(diào)色板的位圖,圖象數(shù)據(jù)就是該象素顏在調(diào)色板中的索引值。對于真彩色圖,圖象數(shù)據(jù)就是實(shí)際的R、G、B值。對于2色位圖,用1位就可以表示該象素的顏色(一般0表示黑,1表示白),所以一個字節(jié)可以表示8個象素。對于16色位圖,用4位可以表示一個象素的顏色,所以一個字節(jié)可以表示2個象素。對于256色位圖,一個字節(jié)剛好可以表示1個象素。對于真彩色圖,三個字節(jié)才能表示1個象素。要注意兩點(diǎn): (1) 每一行的字節(jié)數(shù)必須是4的整倍數(shù),如果不是,則需要補(bǔ)齊。 (2) 一般來說,.bMP文件的數(shù)據(jù)從下到上,從左到右的。也就是說,從文件中最先讀到的是圖象最下面一行的左邊第一個象素,然后是左邊第二個象素……接下來是倒數(shù)第二行左邊第一個象素,左邊第二個象素……依次類推 ,最后得到的是最上面一行的最右一個象素。
16色系統(tǒng)調(diào)色板:
0 = RGB( 0, 0, 0) = 0x00000000;
1 = RGB(128, 0, 0) = 0x00000080;
2 = RGB( 0,128, 0) = 0x00008000;
3 = RGB(128,128, 0) = 0x00008080;
4 = RGB( 0, 0,128) = 0x00800000;
5 = RGB(128, 0,128) = 0x00800080;
6 = RGB( 0,128,128) = 0x00808000;
7 = RGB(128,128,128) = 0x00808080;
8 = RGB(192,192,192) = 0x00c0c0c0;
9 = RGB(255, 0, 0) = 0x000000ff;
10 = RGB( 0,255, 0) = 0x0000ff00;
11 = RGB(255,255, 0) = 0x0000ffff;
12 = RGB( 0, 0,255) = 0x00ff0000;
13 = RGB(255, 0,255) = 0x00ff00ff;
14 = RGB( 0,255,255) = 0x00ffff00;
15 = RGB(255,255,255) = 0x00ffffff;
圖像數(shù)據(jù)起始:000A-000D
圖像數(shù)據(jù)大小:0022-0025
圖像信息大?。?00E-0011
圖像寬度:0012-0015
圖像高度:0016-0019