一、BMP圖片的文件結(jié)構(gòu) BMP文件的數(shù)據(jù)在磁盤上是按以下順序存儲(chǔ)的: [位圖文件頭TBitmapFileHeader][位圖信息頭TBitmapInfo][圖象數(shù)據(jù)BGRA] 每段的具體內(nèi)容如下: TBitmapFileHeader= packed record bfType: Word; //占2位,,文件標(biāo)識(shí)‘BM’ bfSize: DWORD; //占4位,,用字節(jié)表示的整個(gè)文件的大小 bfReserved1: Word; //占2位,保留字節(jié),,為0 bfReserved2: Word; //占2位,,保留字節(jié),,為0 bfOffBits: DWORD; //占4位,圖象數(shù)據(jù)RGBA的起始地址 end;
TBitmapInfo= packed record biSize: DWORD; //占4位,,位圖信息頭(Bitmap Info Header)的長(zhǎng)度,一般為$28 biWidth: Longint; //占4位,,位圖的寬度,以象素為單位 biHeight: Longint; //占4位,,位圖的高度,,以象素為單位 biPlanes: Word; //占2位,位圖的位面數(shù)(注:該值將總是1) biBitCount: Word; //占2位,,每個(gè)象素的位數(shù),,設(shè)為32(32Bit位圖) biCompression: DWORD; //占4位,壓縮說(shuō)明,,設(shè)為0(不壓縮) biSizeImage: DWORD; //占4位,,用字節(jié)數(shù)表示的位圖數(shù)據(jù)的大小,。該數(shù)必須是4的倍數(shù) biXPelsPerMeter: Longint; //占4位,用象素/米表示的水平分辨率 biYPelsPerMeter: Longint; //占4位,,用象素/米表示的垂直分辨率 biClrUsed: DWORD; //占4位,,位圖使用的顏色數(shù) biClrImportant: DWORD; //占4位,指定重要的顏色數(shù)(到此處剛好40個(gè)字節(jié),,$28) biImportant: DWORD; //占4位,,調(diào)色板規(guī)范,,設(shè)為0 end;
圖象數(shù)據(jù)BGRA:這段為實(shí)際圖像數(shù)據(jù),默認(rèn)的BMP是不支持ALPHA通道的,,但對(duì)32位BMP而言,,每個(gè)象素用32位(4個(gè)字節(jié))表示,前三個(gè)字節(jié)表示RGB分量,,最后一個(gè)字節(jié)可以做為ALPHA通道的值,,因此32位位圖可以存儲(chǔ)帶ALPHA通道的圖像,在文件中,,各分量的存儲(chǔ)順序?yàn)锽GRA,,BGRA,BGRA,,BGRA... 另外要注意的是,,BMP圖像的象素存儲(chǔ)順序是從下到上
在DX格式中也有微軟的描述: All formats are listed from left to right, most-significant bit to least-significant bit. For example, D3DFORMAT_ARGB is ordered from the most-significant bit channel A (alpha), to the least-significant bit channel B (blue). When traversing surface data, the data is stored in memory from least-significant bit to most-significant bit, which means that the channel order in memory is from least-significant bit (blue) to most-significant bit (alpha).
if (pDevice->CreateTexture (bmih.biWidth,bmih.biHeight, 1,0,D3DFMT_A8R8G8B8 , D3DPOOL_MANAGED ,ppTexture,0)==D3D_OK) { res=1; D3DLOCKED_RECT stLockedRect; (*ppTexture)->LockRect( 0, &stLockedRect, 0, 0 ); BYTE *pch=(BYTE*)stLockedRect.pBits; for (int i=bmih.biHeight-1;i>=0;i--) { for (int j=0;j<bmih.biWidth;j++) { pch[0]=bmpdata[i*bmih.biWidth*4+j*4+0]; //B pch[1]=bmpdata[i*bmih.biWidth*4+j*4+1]; //G pch[2]=bmpdata[i*bmih.biWidth*4+j*4+2]; //R pch[3]=bmpdata[i*bmih.biWidth*4+j*4+3]; //A pch+=4; } } (*ppTexture)->UnlockRect(0); } 我們?cè)阪i定一張紋理后,紋理的格式是D3DFMT_A8R8G8B8,我們進(jìn)行內(nèi)存操作的時(shí)候就是反向的B,G,R,A進(jìn)行賦值
BMP文件格式分析 簡(jiǎn)介 BMP(Bitmap-File)圖形文件是Windows采用的圖形文件格式,,在Windows環(huán)境下運(yùn)行的所有圖象處理軟件都支持BMP圖象文件格式,。Windows系統(tǒng)內(nèi)部各圖像繪制操作都是以BMP為基礎(chǔ)的。Windows 3.0以前的BMP圖文件格式與顯示設(shè)備有關(guān),,因此把這種BMP圖象文件格式稱為設(shè)備相關(guān)位圖DDB(device-dependent bitmap)文件格式,。Windows 3.0以后的BMP圖象文件與顯示設(shè)備無(wú)關(guān),因此把這種BMP圖象文件格式稱為設(shè)備無(wú)關(guān)位圖DIB(device-independent bitmap)格式(注:Windows 3.0以后,,在系統(tǒng)中仍然存在DDB位圖,,象BitBlt()這種函數(shù)就是基于DDB位圖的,只不過(guò)如果你想將圖像以BMP格式保存到磁盤文件中時(shí),,微軟極力推薦你以DIB格式保存),,目的是為了讓Windows能夠在任何類型的顯示設(shè)備上顯示所存儲(chǔ)的圖象。BMP位圖文件默認(rèn)的文件擴(kuò)展名是BMP或者bmp(有時(shí)它也會(huì)以.DIB或.RLE作擴(kuò)展名),。 6.1.2 文件結(jié)構(gòu) 位圖文件可看成由4個(gè)部分組成:位圖文件頭(bitmap-file header),、位圖信息頭(bitmap-information header)、彩色表(color table)和定義位圖的字節(jié)陣列,,它具有如下所示的形式,。 位圖文件的組成 | 結(jié)構(gòu)名稱 | 符號(hào) | 位圖文件頭(bitmap-file header) | BITMAPFILEHEADER | bmfh | 位圖信息頭(bitmap-information header) | BITMAPINFOHEADER | bmih | 彩色表(color table) | RGBQUAD | aColors[] | 圖象數(shù)據(jù)陣列字節(jié) | BYTE | aBitmapBits[] |
位圖文件結(jié)構(gòu)可綜合在表6-01中。 表01 位圖文件結(jié)構(gòu)內(nèi)容摘要 | 偏移量 | 域的名稱 | 大小 | 內(nèi)容 | 圖象文件 頭 | 0000h | 文件標(biāo)識(shí) | 2 bytes | 兩字節(jié)的內(nèi)容用來(lái)識(shí)別位圖的類型: ‘BM’ : Windows 3.1x, 95, NT, … ‘BA’ :OS/2 Bitmap Array ‘CI’ :OS/2 Color Icon ‘CP’ :OS/2 Color Pointer ‘IC’ : OS/2 Icon ‘PT’ :OS/2 Pointer 注:因?yàn)?/span>OS/2系統(tǒng)并沒(méi)有被普及開,,所以在編程時(shí),,你只需判斷第一個(gè)標(biāo)識(shí)“BM”就行。 | | 0002h | File Size | 1 dword | 用字節(jié)表示的整個(gè)文件的大小 | | 0006h | Reserved | 1 dword | 保留,,必須設(shè)置為0 | | 000Ah | Bitmap Data Offset | 1 dword | 從文件開始到位圖數(shù)據(jù)開始之間的數(shù)據(jù)(bitmap data)之間的偏移量 | | 000Eh | Bitmap Header Size | 1 dword | 位圖信息頭(Bitmap Info Header)的長(zhǎng)度,,用來(lái)描述位圖的顏色、壓縮方法等。下面的長(zhǎng)度表示: 28h - Windows 3.1x, 95, NT, … 0Ch - OS/2 1.x F0h - OS/2 2.x 注:在Windows95,、98,、2000等操作系統(tǒng)中,位圖信息頭的長(zhǎng)度并不一定是28h,,因?yàn)槲④浺呀?jīng)制定出了新的BMP文件格式,,其中的信息頭結(jié)構(gòu)變化比較大,長(zhǎng)度加長(zhǎng),。所以最好不要直接使用常數(shù)28h,,而是應(yīng)該從具體的文件中讀取這個(gè)值。這樣才能確保程序的兼容性,。 | | 0012h | Width | 1 dword | 位圖的寬度,,以象素為單位 | | 0016h | Height | 1 dword | 位圖的高度,以象素為單位 | | 001Ah | Planes | 1 word | 位圖的位面數(shù)(注:該值將總是1) | 圖象
信息 頭 | 001Ch | Bits Per Pixel | 1 word | 每個(gè)象素的位數(shù) 1 - 單色位圖(實(shí)際上可有兩種顏色,,缺省情況下是黑色和白色,。你可以自己定義這兩種顏色) 4 - 16 色位圖 8 - 256 色位圖 16 - 16bit 高彩色位圖 24 - 24bit 真彩色位圖 32 - 32bit 增強(qiáng)型真彩色位圖 | | 001Eh | Compression | 1 dword | 壓縮說(shuō)明: 0 - 不壓縮 (使用BI_RGB表示) 1 - RLE 8-使用8位RLE壓縮方式(用BI_RLE8表示) 2 - RLE 4-使用4位RLE壓縮方式(用BI_RLE4表示) 3 - Bitfields-位域存放方式(用BI_BITFIELDS表示) | | 0022h | Bitmap Data Size | 1 dword | 用字節(jié)數(shù)表示的位圖數(shù)據(jù)的大小。該數(shù)必須是4的倍數(shù) | | 0026h | HResolution | 1 dword | 用象素/米表示的水平分辨率 | | 002Ah | VResolution | 1 dword | 用象素/米表示的垂直分辨率 | | 002Eh | Colors | 1 dword | 位圖使用的顏色數(shù),。如8-比特/象素表示為100h或者 256. | | 0032h | Important Colors | 1 dword | 指定重要的顏色數(shù),。當(dāng)該域的值等于顏色數(shù)時(shí)(或者等于0時(shí)),表示所有顏色都一樣重要 | 調(diào)色板數(shù)據(jù) | 根據(jù)BMP版本的不同而不同 | Palette | N * 4 byte | 調(diào)色板規(guī)范,。對(duì)于調(diào)色板中的每個(gè)表項(xiàng),,這4個(gè)字節(jié)用下述方法來(lái)描述RGB的值: | 1字節(jié)用于藍(lán)色分量 | | 1字節(jié)用于綠色分量 | | 1字節(jié)用于紅色分量 | | 1字節(jié)用于填充符(設(shè)置為0) |
| 圖象數(shù)據(jù) | 根據(jù)BMP版本及調(diào)色板尺寸的不同而不同 | Bitmap Data | xxx bytes | 該域的大小取決于壓縮方法及圖像的尺寸和圖像的位深度,它包含所有的位圖數(shù)據(jù)字節(jié),,這些數(shù)據(jù)可能是彩色調(diào)色板的索引號(hào),,也可能是實(shí)際的RGB值,這將根據(jù)圖像信息頭中的位深度值來(lái)決定,。 |
構(gòu)件詳解 1. 位圖文件頭 位圖文件頭包含有關(guān)于文件類型,、文件大小、存放位置等信息,,在Windows 3.0以上版本的位圖文件中用BITMAPFILEHEADER結(jié)構(gòu)來(lái)定義: typedef struct tagBITMAPFILEHEADER { /* bmfh */ UINT bfType; DWORD bfSize; UINT bfReserved1; UINT bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER; 其中: bfType | 說(shuō)明文件的類型.(該值必需是0x4D42,,也就是字符'BM'。我們不需要判斷OS/2的位圖標(biāo)識(shí),,這么做現(xiàn)在來(lái)看似乎已經(jīng)沒(méi)有什么意義了,,而且如果要支持OS/2的位圖,程序?qū)⒆兊煤芊爆?。所以,,在此只建議你檢察'BM'標(biāo)識(shí)) | bfSize | 說(shuō)明文件的大小,用字節(jié)為單位 | bfReserved1 | 保留,,必須設(shè)置為0 | bfReserved2 | 保留,必須設(shè)置為0 | bfOffBits | 說(shuō)明從文件頭開始到實(shí)際的圖象數(shù)據(jù)之間的字節(jié)的偏移量,。這個(gè)參數(shù)是非常有用的,,因?yàn)槲粓D信息頭和調(diào)色板的長(zhǎng)度會(huì)根據(jù)不同情況而變化,,所以你可以用這個(gè)偏移值迅速的從文件中讀取到位數(shù)據(jù)。 |
2. 位圖信息頭 位圖信息用BITMAPINFO結(jié)構(gòu)來(lái)定義,,它由位圖信息頭(bitmap-information header)和彩色表(color table)組成,,前者用BITMAPINFOHEADER結(jié)構(gòu)定義,后者用RGBQUAD結(jié)構(gòu)定義,。BITMAPINFO結(jié)構(gòu)具有如下形式: typedef struct tagBITMAPINFO { /* bmi */ BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO; 其中: bmiHeader | 說(shuō)明BITMAPINFOHEADER結(jié)構(gòu),,其中包含了有關(guān)位圖的尺寸及位格式等信息 | bmiColors | 說(shuō)明彩色表RGBQUAD結(jié)構(gòu)的陣列,,其中包含索引圖像的真實(shí)RGB值,。 |
BITMAPINFOHEADER結(jié)構(gòu)包含有位圖文件的大小、壓縮類型和顏色格式,,其結(jié)構(gòu)定義為: typedef struct tagBITMAPINFOHEADER { /* bmih */ DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER; 其中: biSize | 說(shuō)明BITMAPINFOHEADER結(jié)構(gòu)所需要的字?jǐn)?shù),。注:這個(gè)值并不一定是BITMAPINFOHEADER結(jié)構(gòu)的尺寸,,它也可能是sizeof(BITMAPV4HEADER)的值,或是sizeof(BITMAPV5HEADER)的值,。這要根據(jù)該位圖文件的格式版本來(lái)決定,,不過(guò),就現(xiàn)在的情況來(lái)看,,絕大多數(shù)的BMP圖像都是BITMAPINFOHEADER結(jié)構(gòu)的(可能是后兩者太新的緣故吧:-),。 | biWidth | 說(shuō)明圖象的寬度,以象素為單位 | biHeight | 說(shuō)明圖象的高度,,以象素為單位,。注:這個(gè)值除了用于描述圖像的高度之外,它還有另一個(gè)用處,,就是指明該圖像是倒向的位圖,,還是正向的位圖。如果該值是一個(gè)正數(shù),,說(shuō)明圖像是倒向的,,如果該值是一個(gè)負(fù)數(shù),則說(shuō)明圖像是正向的,。大多數(shù)的BMP文件都是倒向的位圖,,也就是時(shí),高度值是一個(gè)正數(shù),。(注:當(dāng)高度值是一個(gè)負(fù)數(shù)時(shí)(正向圖像),,圖像將不能被壓縮(也就是說(shuō)biCompression成員將不能是BI_RLE8或BI_RLE4)。 | biPlanes | 為目標(biāo)設(shè)備說(shuō)明位面數(shù),,其值將總是被設(shè)為1 | biBitCount | 說(shuō)明比特?cái)?shù)/象素,,其值為1、4、8,、16,、24、或32 | biCompression | 說(shuō)明圖象數(shù)據(jù)壓縮的類型,。其值可以是下述值之一:
| BI_RGB:沒(méi)有壓縮,;
| | BI_RLE8:每個(gè)象素8比特的RLE壓縮編碼,,壓縮格式由2字節(jié)組成(重復(fù)象素計(jì)數(shù)和顏色索引);
| | BI_RLE4:每個(gè)象素4比特的RLE壓縮編碼,,壓縮格式由2字節(jié)組成
| | BI_BITFIELDS:每個(gè)象素的比特由指定的掩碼決定,。
|
| biSizeImage | 說(shuō)明圖象的大小,以字節(jié)為單位,。當(dāng)用BI_RGB格式時(shí),,可設(shè)置為0 | biXPelsPerMeter | 說(shuō)明水平分辨率,用象素/米表示 | biYPelsPerMeter | 說(shuō)明垂直分辨率,,用象素/米表示 | biClrUsed | 說(shuō)明位圖實(shí)際使用的彩色表中的顏色索引數(shù)(設(shè)為0的話,,則說(shuō)明使用所有調(diào)色板項(xiàng)) | biClrImportant | 說(shuō)明對(duì)圖象顯示有重要影響的顏色索引的數(shù)目,如果是0,,表示都重要,。 |
現(xiàn)就BITMAPINFOHEADER結(jié)構(gòu)作如下說(shuō)明: (1) 彩色表的定位 應(yīng)用程序可使用存儲(chǔ)在biSize成員中的信息來(lái)查找在BITMAPINFO結(jié)構(gòu)中的彩色表,如下所示: pColor = ((LPSTR) pBitmapInfo + (WORD) (pBitmapInfo->bmiHeader.biSize)) (2) biBitCount biBitCount=1 表示位圖最多有兩種顏色,,缺省情況下是黑色和白色,你也可以自己定義這兩種顏色,。圖像信息頭裝調(diào)色板中將有兩個(gè)調(diào)色板項(xiàng),稱為索引0和索引1,。圖象數(shù)據(jù)陣列中的每一位表示一個(gè)象素。如果一個(gè)位是0,,顯示時(shí)就使用索引0的RGB值,,如果位是1,則使用索引1的RGB值,。 biBitCount=4 表示位圖最多有16種顏色,。每個(gè)象素用4位表示,并用這4位作為彩色表的表項(xiàng)來(lái)查找該象素的顏色,。例如,,如果位圖中的第一個(gè)字節(jié)為0x1F,,它表示有兩個(gè)象素,,第一象素的顏色就在彩色表的第2表項(xiàng)中查找,而第二個(gè)象素的顏色就在彩色表的第16表項(xiàng)中查找,。此時(shí),,調(diào)色板中缺省情況下會(huì)有16個(gè)RGB項(xiàng)。對(duì)應(yīng)于索引0到索引15,。 biBitCount=8 表示位圖最多有256種顏色,。每個(gè)象素用8位表示,并用這8位作為彩色表的表項(xiàng)來(lái)查找該象素的顏色,。例如,,如果位圖中的第一個(gè)字節(jié)為0x1F,這個(gè)象素的顏色就在彩色表的第32表項(xiàng)中查找,。此時(shí),,缺省情況下,調(diào)色板中會(huì)有256個(gè)RGB項(xiàng),,對(duì)應(yīng)于索引0到索引255,。 biBitCount=16 表示位圖最多有216種顏色。每個(gè)色素用16位(2個(gè)字節(jié))表示,。這種格式叫作高彩色,,或叫增強(qiáng)型16位色,或64K色,。它的情況比較復(fù)雜,,當(dāng)biCompression成員的值是BI_RGB時(shí),它沒(méi)有調(diào)色板,。16位中,,最低的5位表示藍(lán)色分量,中間的5位表示綠色分量,,高的5位表示紅色分量,,一共占用了15位,最高的一位保留,,設(shè)為0,。這種格式也被稱作555 16位位圖。如果biCompression成員的值是BI_BITFIELDS,,那么情況就復(fù)雜了,,首先是原來(lái)調(diào)色板的位置被三個(gè)DWORD變量占據(jù),,稱為紅、綠,、藍(lán)掩碼,。分別用于描述紅、綠,、藍(lán)分量在16位中所占的位置,。在Windows 95(或98)中,系統(tǒng)可接受兩種格式的位域:555和565,,在555格式下,,紅、綠,、藍(lán)的掩碼分別是:0x7C00,、0x03E0、0x001F,,而在565格式下,,它們則分別為:0xF800、0x07E0,、0x001F,。你在讀取一個(gè)像素之后,可以分別用掩碼“與”上像素值,,從而提取出想要的顏色分量(當(dāng)然還要再經(jīng)過(guò)適當(dāng)?shù)淖笥乙撇僮鳎?。?/span>NT系統(tǒng)中,則沒(méi)有格式限制,,只不過(guò)要求掩碼之間不能有重疊,。(注:這種格式的圖像使用起來(lái)是比較麻煩的,不過(guò)因?yàn)樗娘@示效果接近于真彩,,而圖像數(shù)據(jù)又比真彩圖像小的多,,所以,它更多的被用于游戲軟件),。 biBitCount=24 表示位圖最多有224種顏色,。這種位圖沒(méi)有調(diào)色板(bmiColors成員尺寸為0),在位數(shù)組中,,每3個(gè)字節(jié)代表一個(gè)象素,,分別對(duì)應(yīng)于顏色R、G,、B,。 biBitCount=32 表示位圖最多有232種顏色。這種位圖的結(jié)構(gòu)與16位位圖結(jié)構(gòu)非常類似,,當(dāng)biCompression成員的值是BI_RGB時(shí),,它也沒(méi)有調(diào)色板,,32位中有24位用于存放RGB值,順序是:最高位—保留,,紅8位,、綠8位、藍(lán)8位,。這種格式也被成為888 32位圖,。如果 biCompression成員的值是BI_BITFIELDS時(shí),原來(lái)調(diào)色板的位置將被三個(gè)DWORD變量占據(jù),,成為紅,、綠,、藍(lán)掩碼,,分別用于描述紅、綠,、藍(lán)分量在32位中所占的位置,。在Windows 95(or 98)中,系統(tǒng)只接受888格式,,也就是說(shuō)三個(gè)掩碼的值將只能是:0xFF0000,、0xFF00、0xFF,。而在NT系統(tǒng)中,,你只要注意使掩碼之間不產(chǎn)生重疊就行。(注:這種圖像格式比較規(guī)整,,因?yàn)樗?/span>DWORD對(duì)齊的,,所以在內(nèi)存中進(jìn)行圖像處理時(shí)可進(jìn)行匯編級(jí)的代碼優(yōu)化(簡(jiǎn)單))。 (3) ClrUsed BITMAPINFOHEADER結(jié)構(gòu)中的成員ClrUsed指定實(shí)際使用的顏色數(shù)目,。如果ClrUsed設(shè)置成0,,位圖使用的顏色數(shù)目就等于biBitCount成員中的數(shù)目。請(qǐng)注意,,如果ClrUsed的值不是可用顏色的最大值或不是0,,則在編程時(shí)應(yīng)該注意調(diào)色板尺寸的計(jì)算,比如在4位位圖中,,調(diào)色板的缺省尺寸應(yīng)該是16*sizeof(RGBQUAD),,但是,如果ClrUsed的值不是16或者不是0,,那么調(diào)色板的尺寸就應(yīng)該是ClrUsed*sizeof(RGBQUAD),。 (4) 圖象數(shù)據(jù)壓縮 ① BI_RLE8:每個(gè)象素為8比特的RLE壓縮編碼,可使用編碼方式和絕對(duì)方式中的任何一種進(jìn)行壓縮,,這兩種方式可在同一幅圖中的任何地方使用,。 編碼方式:由2個(gè)字節(jié)組成,,第一個(gè)字節(jié)指定使用相同顏色的象素?cái)?shù)目,第二個(gè)字節(jié)指定使用的顏色索引,。此外,,這個(gè)字節(jié)對(duì)中的第一個(gè)字節(jié)可設(shè)置為0,聯(lián)合使用第二個(gè)字節(jié)的值表示: | 第二個(gè)字節(jié)的值為0:行的結(jié)束,。
| | 第二個(gè)字節(jié)的值為1:圖象結(jié)束,。
| | 第二個(gè)字節(jié)的值為2:其后的兩個(gè)字節(jié)表示下一個(gè)象素從當(dāng)前開始的水平和垂直位置的偏移量。
|
絕對(duì)方式:第一個(gè)字節(jié)設(shè)置為0,,而第二個(gè)字節(jié)設(shè)置為0x03~0xFF之間的一個(gè)值,。在這種方式中,第二個(gè)字節(jié)表示跟在這個(gè)字節(jié)后面的字節(jié)數(shù),,每個(gè)字節(jié)包含單個(gè)象素的顏色索引,。壓縮數(shù)據(jù)格式需要字邊界(word boundary)對(duì)齊。下面的例子是用16進(jìn)制表示的8-位壓縮圖象數(shù)據(jù): 03 04 05 06 00 03 45 56 67 00 02 78 00 02 05 01 02 78 00 00 09 1E 00 01 這些壓縮數(shù)據(jù)可解釋為 : 壓縮數(shù)據(jù) | 擴(kuò)展數(shù)據(jù) | 03 04 | 04 04 04 | 05 06 | 06 06 06 06 06 | 00 03 45 56 67 00 | 45 56 67 | 02 78 | 78 78 | 00 02 05 01 | 從當(dāng)前位置右移5個(gè)位置后向下移一行 | 02 78 | 78 78 | 00 00 | 行結(jié)束 | 09 1E | 1E 1E 1E 1E 1E 1E 1E 1E 1E | 00 01 | RLE編碼圖象結(jié)束 |
② BI_RLE4: 編碼方式:由2個(gè)字節(jié)組成,,第一個(gè)字節(jié)指定象素?cái)?shù)目,,第二個(gè)字節(jié)包含兩種顏色索引,一個(gè)在高4位,,另一個(gè)在低4位,。第一個(gè)象素使用高4位的顏色索引,第二個(gè)使用低4位的顏色索引,,第3個(gè)使用高4位的顏色索引,,依此類推。 絕對(duì)方式:這個(gè)字節(jié)對(duì)中的第一個(gè)字節(jié)設(shè)置為0,,第二個(gè)字節(jié)包含有顏色索引數(shù),,其后續(xù)字節(jié)包含有顏色索引,顏色索引存放在該字節(jié)的高,、低4位中,,一個(gè)顏色索引對(duì)應(yīng)一個(gè)象素。此外,,BI_RLE4也同樣聯(lián)合使用第二個(gè)字節(jié)中的值表示: | 第二個(gè)字節(jié)的值為0:行的結(jié)束,。
| | 第二個(gè)字節(jié)的值為1:圖象結(jié)束。
| | 第二個(gè)字節(jié)的值為2:其后的兩個(gè)字節(jié)表示下一個(gè)象素從當(dāng)前開始的水平和垂直位置的偏移量,。
|
下面的例子是用16進(jìn)制數(shù)表示的4-位壓縮圖象數(shù)據(jù): 03 04 05 06 00 06 45 56 67 00 04 78 00 02 05 01 04 78 00 00 09 1E 00 01 這些壓縮數(shù)據(jù)可解釋為 : 壓縮數(shù)據(jù) | 擴(kuò)展數(shù)據(jù) | 03 04 | 0 4 0 | 05 06 | 0 6 0 6 0 | 00 06 45 56 67 00 | 4 5 5 6 6 7 | 04 78 | 7 8 7 8 | 00 02 05 01 | 從當(dāng)前位置右移5個(gè)位置后向下移一行 | 04 78 | 7 8 7 8 | 00 00 | 行結(jié)束 | 09 1E | 1 E 1 E 1 E 1 E 1 | 00 01 | RLE圖象結(jié)束 |
3. 彩色表 彩色表包含的元素與位圖所具有的顏色數(shù)相同,,象素的顏色用RGBQUAD結(jié)構(gòu)來(lái)定義。對(duì)于24-位真彩色圖象就不使用彩色表(同樣也包括16位,、和32位位圖),,因?yàn)槲粓D中的RGB值就代表了每個(gè)象素的顏色。彩色表中的顏色按顏色的重要性排序,,這可以輔助顯示驅(qū)動(dòng)程序?yàn)椴荒茱@示足夠多顏色數(shù)的顯示設(shè)備顯示彩色圖象,。RGBQUAD結(jié)構(gòu)描述由R,、G、B相對(duì)強(qiáng)度組成的顏色,,定義如下: typedef struct tagRGBQUAD { /* rgbq */ BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; } RGBQUAD; 其中: rgbBlue | 指定藍(lán)色強(qiáng)度 | rgbGreen | 指定綠色強(qiáng)度 | rgbRed | 指定紅色強(qiáng)度 | rgbReserved | 保留,,設(shè)置為0 |
4. 位圖數(shù)據(jù) 緊跟在彩色表之后的是圖象數(shù)據(jù)字節(jié)陣列。圖象的每一掃描行由表示圖象象素的連續(xù)的字節(jié)組成,,每一行的字節(jié)數(shù)取決于圖象的顏色數(shù)目和用象素表示的圖象寬度,。掃描行是由底向上存儲(chǔ)的,這就是說(shuō),,陣列中的第一個(gè)字節(jié)表示位圖左下角的象素,,而最后一個(gè)字節(jié)表示位圖右上角的象素。(只針對(duì)與倒向DIB,,如果是正向DIB,,則掃描行是由頂向下存儲(chǔ)的),倒向DIB的原點(diǎn)在圖像的左下角,,而正向DIB的原點(diǎn)在圖像的左上角,。同時(shí),每一掃描行的字節(jié)數(shù)必需是4的整倍數(shù),,也就是DWORD對(duì)齊的。如果你想確保圖像的掃描行DWORD對(duì)齊,,可使用下面的代碼:
(((width*biBitCount)+31)>>5)<<2 5. 參考書目 《圖象文件格式(上,、下)—Windows編程》 《圖像文件格式大全》 《Programming Windows by Charles Petzold》 6. 相關(guān)站點(diǎn) 各種格式:http://www./ 各種格式:http://www.csdn.net/ 位圖格式:http://www.cica./graphics/image_specs/bmp.format.txt
|