bmp文件大體上分成四個(gè)部分,,如圖1所示,。 圖1. Windows位圖文件結(jié)構(gòu)示意圖 第一部分為位圖文件頭BITMAPFILEHEADER,,是一個(gè)結(jié)構(gòu),其定義如下: typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER; 這個(gè)結(jié)構(gòu)的長(zhǎng)度是固定的,,為14個(gè)字節(jié)(WORD為無(wú)符號(hào)16位整數(shù),,DWORD為無(wú)符號(hào)32位整數(shù)),各個(gè)域的說(shuō)明如下: bfType 指定文件類型,,必須是0x424D,,即字符串”BM”,也就是說(shuō)所有.bmp文件的頭兩個(gè)字節(jié)都是”BM” bfSize 指定文件大小,,包括這14個(gè)字節(jié) bfReserved1,,bfReserved2 為保留字,不用考慮 bfOffBits 為從文件頭到實(shí)際的位圖數(shù)據(jù)的偏移字節(jié)數(shù),,即圖1中前三個(gè)部分的長(zhǎng)度之和,。 第二部分為位圖信息頭BITMAPINFOHEADER,也是一個(gè)結(jié)構(gòu),,其定義如下: typedef struct tagBITMAPINFOHEADER{ DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER; 這個(gè)結(jié)構(gòu)的長(zhǎng)度是固定的,,為40個(gè)字節(jié)(WORD為無(wú)符號(hào)16位整數(shù),DWORD無(wú)符號(hào)32位整數(shù),LONG為32位整數(shù)),,各個(gè)域的說(shuō)明如下: biSize 指定這個(gè)結(jié)構(gòu)的長(zhǎng)度,,為40 biWidth 指定圖象的寬度,單位是象素 biHeight 指定圖象的高度,,單位是象素 biPlanes 必須是1,,不用考慮 biBitCount 指定表示顏色時(shí)要用到的位數(shù),常用的值為1(黑白二色圖), 4(16色圖), 8(256色), 24(真彩色圖)(新的.bmp格式支持32位色,,這里就不做討論了),。 biCompression 指定位圖是否壓縮,有效的值為BI_RGB,,BI_RLE8,,BI_RLE4,BI_BITFIELDS(都是一些Windows定義好的常量),。要說(shuō)明的是,,Windows位圖可以采用RLE4,,和RLE8的壓縮格式,,但用的不多。我們今后所討論的只有第一種不壓縮的情況,,即biCompression為BI_RGB的情況,。 biSizeImage 指定實(shí)際的位圖數(shù)據(jù)占用的字節(jié)數(shù),其實(shí)也可以從以下的公式中計(jì)算出來(lái): biSizeImage=biWidth’ * biHeight 要注意的是:上述公式中的biWidth’必須是4的整倍數(shù)(所以不是biWidth,,而是biWidth’,,表示大于或等于biWidth的,,離4最近的整倍數(shù)。舉個(gè)例子,,如果biWidth=240,,則biWidth’=240;如果biWidth=241,,biWidth’=244) 如果biCompression為BI_RGB,,則該項(xiàng)可能為零 biXPelsPerMeter 指定目標(biāo)設(shè)備的水平分辨率,單位是每米的象素個(gè)數(shù),,關(guān)于分辨率的概念,,我們將在打印部分詳細(xì)介紹。 biYPelsPerMeter 指定目標(biāo)設(shè)備的垂直分辨率,,單位同上,。 biClrUsed 指定本圖象實(shí)際用到的顏色數(shù),如果該值為零,,則用到的顏色數(shù)為2的biBitCount次方,。 biClrImportant 指定本圖象中重要的顏色數(shù),如果該值為零,,則認(rèn)為所有的顏色都是重要的,。 第三部分為調(diào)色板(Palette),當(dāng)然,,這里是對(duì)那些需要調(diào)色板的位圖文件而言的,。有些位圖,如真彩色圖,,前面已經(jīng)講過(guò),,是不需要調(diào)色板的,BITMAPINFOHEADER后直接是位圖數(shù)據(jù),。 調(diào)色板實(shí)際上是一個(gè)數(shù)組,,共有biClrUsed個(gè)元素(如果該值為零,則有2的biBitCount次方個(gè)元素),。數(shù)組中每個(gè)元素的類型是一個(gè)RGBQUAD結(jié)構(gòu),,占4個(gè)字節(jié),其定義如下: typedef struct tagRGBQUAD { BYTE rgbBlue; //該顏色的藍(lán)色分量 BYTE rgbGreen; //該顏色的綠色分量 BYTE rgbRed; //該顏色的紅色分量 BYTE rgbReserved; //保留值 } RGBQUAD; 第四部分就是實(shí)際的圖象數(shù)據(jù)了,。對(duì)于用到調(diào)色板的位圖,,圖象數(shù)據(jù)就是該像素顏在調(diào)色板中的索引值,對(duì)于真彩色圖,,圖象數(shù)據(jù)就是實(shí)際的R,G,B值,。下面就2色,16色,256色位圖和真彩色位圖分別介紹,。 對(duì)于2色位圖,,用1位就可以表示該像素的顏色(一般0表示黑,1表示白),,所以一個(gè)字節(jié)可以表示8個(gè)像素,。 對(duì)于16色位圖,用4位可以表示一個(gè)像素的顏色,,所以一個(gè)字節(jié)可以表示2個(gè)像素,。 對(duì)于256色位圖,一個(gè)字節(jié)剛好可以表示1個(gè)像素,。 對(duì)于真彩色圖,,三個(gè)字節(jié)才能表示1個(gè)像素。 要注意兩點(diǎn): 1. 每一行的字節(jié)數(shù)必須是4的整倍數(shù),,如果不是,,則需要補(bǔ)齊。 2. 一般來(lái)說(shuō),,.BMP文件的數(shù)據(jù)從下到上,,從左到右的。也就是說(shuō),,從文件中最先讀到的是圖象最下面一行的左邊 |
|