BMP文件存儲結(jié)構(gòu)的格式可以在Windows中的WINGDI_第1頁
BMP文件存儲結(jié)構(gòu)的格式可以在Windows中的WINGDI_第2頁
BMP文件存儲結(jié)構(gòu)的格式可以在Windows中的WINGDI_第3頁
BMP文件存儲結(jié)構(gòu)的格式可以在Windows中的WINGDI_第4頁
BMP文件存儲結(jié)構(gòu)的格式可以在Windows中的WINGDI_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

BMP文件存儲結(jié)構(gòu)的格式可以在Windows中的WINGDI.h文件中找到定義。BMP文件總體上由4部分組成,分別是位圖文件頭、位圖信息頭、調(diào)色板和圖像數(shù)據(jù),如表5-1所示。表5-1BMP文件的組成結(jié)構(gòu)位圖文件頭(bitmap-fileheader)位圖信息頭(bitmap-informationheader)彩色表/調(diào)色板(colortable)位圖數(shù)據(jù)(bitmap-data)下面來詳細看一下每個組成部分的細節(jié)。1.位圖文件頭(bitmap-fileheader)位圖文件頭(bitmap-fileheader)包含了圖像類型、圖像大小、圖像數(shù)據(jù)存放地址和兩個保留未使用的字段。打開WINGDI.h文件,搜索"BITMAPFILEHEADER"就可以定位到BMP文件的位圖文件頭的數(shù)據(jù)結(jié)構(gòu)定義。typedefstructtagBITMAPFILEHEADER{

WORD

bfType;

DWORD

bfSize;

WORD

bfReserved1;

WORD

bfReserved2;

DWORD

bfOffBits;

}BITMAPFILEHEADER,FAR*LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;表5-2列出了tagBITMAPFILEHEADER中各字段的含義。表5-2tagBITMAPFILEHEADER結(jié)構(gòu)字段名大?。▎挝唬鹤止?jié))描述bfType2位圖類別,根據(jù)不同的操作系統(tǒng)而不同,在Windows中,此字段的值總為‘BM’bfSize4BMP圖像文件的大小bfReserved12總為0bfReserved22總為0bfOffBits4BMP圖像數(shù)據(jù)的地址2.位圖信息頭(bitmap-informationheader)位圖信息頭(bitmap-informationheader)包含了位圖信息頭的大小、圖像的寬高、圖像的色深、壓縮說明圖像數(shù)據(jù)的大小和其他一些參數(shù)。打開WINGDI.h文件,搜索"tagBITMAPINFOHEADER"就可以定位到BMP文件的位圖信息頭的數(shù)據(jù)結(jié)構(gòu)定義。typedefstructtagBITMAPINFOHEADER{

DWORD

biSize;

LONG

biWidth;

LONG

biHeight;

WORD

biPlanes;

WORD

biBitCount;

DWORD

biCompression;

DWORD

biSizeImage;

LONG

biXPelsPerMeter;

LONG

biYPelsPerMeter;

DWORD

biClrUsed;

DWORD

biClrImportant;

}BITMAPINFOHEADER,FAR*LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;表5-3列出了tagBITMAPFILEHEADER中各字段的含義。表5-3tagBITMAPFILEHEADER結(jié)構(gòu)字段名大小(單位:字節(jié))描述biSize4本結(jié)構(gòu)的大小,根據(jù)不同的操作系統(tǒng)而不同,在Windows中,此字段的值總為28h字節(jié)=40字節(jié)biWidth4BMP圖像的寬度,單位像素biHeight4總為0biPlanes2總為0biBitCount2BMP圖像的色深,即一個像素用多少位表示,常見有1、4、8、16、24和32,分別對應(yīng)單色、16色、256色、16位高彩色、24位真彩色和32位增強型真彩色biCompression4壓縮方式,0表示不壓縮,1表示RLE8壓縮,2表示RLE4壓縮,3表示每個像素值由指定的掩碼決定biSizeImage4BMP圖像數(shù)據(jù)大小,必須是4的倍數(shù),圖像數(shù)據(jù)大小不是4的倍數(shù)時用0填充補足biXPelsPerMeter4水平分辨率,單位像素/mbiYPelsPerMeter4垂直分辨率,單位像素/mbiClrUsed4BMP圖像使用的顏色,0表示使用全部顏色,對于256色位圖來說,此值為100h=256biClrImportant4重要的顏色數(shù),此值為0時所有顏色都重要,對于使用調(diào)色板的BMP圖像來說,當(dāng)顯卡不能夠顯示所有顏色時,此值將輔助驅(qū)動程序顯示顏色3.彩色表/調(diào)色板(colortable)彩色表/調(diào)色板(colortable)是單色、16色和256色圖像文件所特有的,相對應(yīng)的調(diào)色板大小是2、16和256,調(diào)色板以4字節(jié)為單位,每4個字節(jié)存放一個顏色值,圖像的數(shù)據(jù)是指向調(diào)色板的索引??梢詫⒄{(diào)色板想象成一個數(shù)組,每個數(shù)組元素的大小為4字節(jié),假設(shè)有一256色的BMP圖像的調(diào)色板數(shù)據(jù)為:調(diào)色板[0]=黑、調(diào)色板[1]=白、調(diào)色板[2]=紅、調(diào)色板[3]=藍…調(diào)色板[255]=黃圖像數(shù)據(jù)010002FF表示調(diào)用調(diào)色板[1]、調(diào)色板[0]、調(diào)色板[2]和調(diào)色板[255]中的數(shù)據(jù)來顯示圖像顏色。在早期的計算機中,顯卡相對比較落后,不一定能保證顯示所有顏色,所以在調(diào)色板中的顏色數(shù)據(jù)應(yīng)盡可能將圖像中主要的顏色按順序排列在前面,位圖信息頭的biClrImportant字段指出了有多少種顏色是重要的。每個調(diào)色板的大小為4字節(jié),按藍、綠、紅存儲一個顏色值。打開WINGDI.h文件,搜索"tagRGBTRIPLE"就可以定位到BMP文件的調(diào)色板的數(shù)據(jù)結(jié)構(gòu)定義。typedefstructtagRGBQUAD{

BYTE

rgbBlue;

BYTE

rgbGreen;

BYTE

rgbRed;

BYTE

rgbReserved;

}RGBQUAD;表5-4列出了tagRGBTRIPLE中各字段的含義。表5-4tagRGBTRIPLE結(jié)構(gòu)字段名大?。▎挝唬鹤止?jié))描述rgbBlue1藍色值rgbGreen1綠色值rgbRed1紅色值rgbReserved1保留,總為04.位圖數(shù)據(jù)(bitmap-data)如果圖像是單色、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位,最后一位保留,設(shè)為0。24位圖像使用3字節(jié)保存顏色值,每一個字節(jié)代表一種顏色,按紅、綠、藍排列。32位圖像使用4字節(jié)保存顏色值,每一個字節(jié)代表一種顏色,除了原來的紅、綠、藍,還有Alpha通道,即透明色。如果圖像帶有調(diào)色板,則位圖數(shù)據(jù)可以根據(jù)需要選擇壓縮與不壓縮,如果選擇壓縮,則根據(jù)BMP圖像是16色或256色,采用RLE4或RLE8壓縮算法壓縮。RLE4是壓縮16色圖像數(shù)據(jù)的,RLE4采用表5-5所示方式壓縮數(shù)據(jù)。表5-5RLE4壓縮方法方案1字節(jié)2字節(jié)3字節(jié)4字節(jié)N字節(jié)A重復(fù)次數(shù)顏色索引

B設(shè)為0后面有效的顏色索引數(shù)顏色索引顏色索引顏色索引…假設(shè)有如下16色位圖數(shù)據(jù),共20字節(jié),數(shù)據(jù)使用了RLE4壓縮:0500040500080905040004050809040807010000數(shù)據(jù)解壓時首先讀取05,因為05不等于0,所以選擇A方案,根據(jù)A方案,05表示后面數(shù)據(jù)重復(fù)的次數(shù),接著讀取00,00表示有兩個顏色索引,每個索引占4位,第一個像素在高4位,第二個像素在低4位,即在一個字節(jié)中低像素在高位,高像素在低位。0500解壓后等于00000。讀取04,選擇A方案,按照上面的操作解析,04是后面數(shù)據(jù)重復(fù)的次數(shù),05是兩個顏色索引,第3個顏色索引為5,第4個顏色索引為0。0405解壓后等于0505。讀取00,選擇B方案,讀取08,08表示后面有效的顏色索引數(shù)。0008解壓后等于09050400。讀取04,選擇A方案,按照上面的操作解析,04是后面數(shù)據(jù)重復(fù)的次數(shù),05是兩個顏色索引。0405解壓后等于0505。讀取08,選擇A方案,按照上面的操作解析,08是后面數(shù)據(jù)重復(fù)的次數(shù),09是兩個顏色索引。0809解壓后等于09090909。

讀取04,選擇A方案,按照上面的操作解析,04是后面數(shù)據(jù)重復(fù)的次數(shù),08是兩個顏色索引。0408解壓后等于0808。讀取07,選擇A方案,按照上面的操作解析,07是后面數(shù)據(jù)重復(fù)的次數(shù),01是兩個顏色索引。0701解壓后等于0101010。讀取00,選擇B方案,讀取00,00表示后面有效的顏色索引數(shù),0表示無,即解壓完一行數(shù)據(jù)。綜合上面的操作,解壓后的數(shù)據(jù)為:0000005050905040005050909090908080101010看上去和原來的數(shù)據(jù)大小一樣,沒有體現(xiàn)到壓縮效果,這是因為上面的例子只選擇了20字節(jié)數(shù)據(jù),而且這20字節(jié)數(shù)據(jù)中重復(fù)的數(shù)據(jù)不多,使用RLE壓縮重復(fù)數(shù)據(jù)不多的數(shù)據(jù)時,有時可能壓縮后的大小反而比原來的數(shù)據(jù)還大。其實一般情況下當(dāng)數(shù)據(jù)比較多而且重復(fù)的時候,使用RLE壓縮效果還是比較理想的。RLE8的壓縮方式可以參考上面的RLE4解壓方法,惟一的區(qū)別是RLE8使用1個字節(jié)存放顏色索引,而RLE4使用4位存放顏色索引。結(jié)合上面對BMP文件的分析,下面分別對256色和24位色的BMP圖像進行十六進制分析,通過在十六進制編輯器中分析文件結(jié)構(gòu),能夠增加分析文件的經(jīng)驗。如圖5-1和圖5-2所示,分別為256色BMP圖像cat2.bmp和24位色BMP圖像cat1.bmp。其中cat2.bmp圖像的分辨率為200×153,文件大小為31680字節(jié)。cat1.bmp圖像的分辨率為200×150,文件大小為90056字節(jié)。圖5-1

cat2.bmp圖像圖5-2

cat1.bmp圖像現(xiàn)在來分析cat2.bmp的圖像文件,在Winhex中打開cat2.bmp,如圖5-3所示。(點擊查看大圖)圖5-3

在Winhex中打開cat2.bmp圖像文件首先分析位圖文件頭的結(jié)構(gòu),如圖5-4所示。根據(jù)BMP文件的位圖文件頭結(jié)構(gòu)定義分析出cat2.bmp圖像的位圖文件頭中各字段的含義,如表5-6所示。(點擊查看大圖)圖5-4

cat2.bmp圖像文件的位圖文件頭表5-6cat2.bmp圖像文件中位圖文件頭各字段的含義十六進制值描述424D:BM的ASCII值,在Windows中的BMP文件標識符C07B00007BC0h=31680,是cat2文件的大小00000000保留值,總為0360400436h=1078,是圖像數(shù)據(jù)的地址,即文件頭+信息頭+調(diào)色板的長度繼續(xù)分析接下來的數(shù)據(jù),根據(jù)BMP文件結(jié)構(gòu)的定義,接下來的數(shù)據(jù)是位圖信息頭,cat2.bmp圖像文件的位圖信息頭的內(nèi)容如圖5-5所示。(點擊查看大圖)圖5-5

cat2.bmp圖像的位圖信息頭表5-7所示為cat2.bmp圖像文件中位圖信息頭各字段的含義。表5-7cat2.bmp圖像文件中位圖信息頭各字段的含義十六進制值描述28000000:cat2.bmp圖像的位圖信息頭大小C8000000000000C8=200,是cat2圖像的寬度,單位像素9900000000000099=153,是cat2圖像的高度,單位像素0100總是108000008=8,cat2圖像的色深,即2的8次冪等于256色00000000壓縮方式,0表示不壓縮8A7700000000778A=30602,是cat2圖像的圖像數(shù)據(jù)大小,單位字節(jié)120B000000000B12=2834,cat2圖像的水平分辨率,單位像素/m120B000000000B12=2834,cat2圖像的垂直分辨率,單位像素/m00000000cat2圖像使用的顏色數(shù),0表示使用全部顏色00000000cat2圖像中重要的顏色數(shù),0表示所有顏色都重要繼續(xù)分析接下來的數(shù)據(jù),根據(jù)BMP文件結(jié)構(gòu)的定義,因為cat2.bmp圖像是256色的位圖,所以應(yīng)該有256個調(diào)色板,每個調(diào)色板占4字節(jié),整個調(diào)色板一共1024字節(jié)大小。cat2.bmp圖像文件的調(diào)色板數(shù)據(jù)如圖5-6和圖5-7所示。(點擊查看大圖)圖5-6

cat2.bmp圖像的調(diào)色板地址從00000036h開始存儲(點擊查看大圖)圖5-7

cat2.bmp圖像的調(diào)色板數(shù)據(jù)結(jié)束地址是00000435h從圖5-6和圖5-7中可以看出,cat2.bmp圖像的調(diào)色板地址從00000036h開始到00000435h結(jié)束,即00000435h-00000036h+1=400h=1024。如果想查看cat2圖像的調(diào)色板對應(yīng)的實際顯示顏色,可以使用AdobePhotoshopCS打開cat2.bmp,在AdobePhotoshopCS的菜單欄中選擇"圖像"→"模式"→"顏色表",即可觀看cat2的調(diào)色板,如圖5-8所示。圖5-8

在AdobePhotoshopCS中查看cat2的調(diào)色板圖5-8所示cat2.bmp的調(diào)色板顏色和圖5-6中的十六進制數(shù)據(jù)是一一對應(yīng)的。在AdobePhotoshopCS的調(diào)色板上單擊任何一個像素的顏色即可彈出一個拾色器對話框顯示該像素顏色的詳細組成信息。cat2.bmp調(diào)色板和cat2.bmp的十六進制數(shù)據(jù)的對應(yīng)關(guān)系如圖5-9所示。繼續(xù)分析接下來的數(shù)據(jù),根據(jù)BMP文件結(jié)構(gòu)的定義,如果一個圖像有調(diào)色板,那么緊跟在調(diào)色板后面的是圖像的數(shù)據(jù),這些數(shù)據(jù)不是實際的顏色值,而是指向調(diào)色板數(shù)組的索引,根據(jù)索引來獲取調(diào)色板中的顏色,如圖5-10所示。(點擊查看大圖)圖5-9

cat2.bmp調(diào)色板和cat2.bmp的十六進制數(shù)據(jù)的對應(yīng)關(guān)系(點擊查看大圖)圖5-10

cat2.bmp的圖像數(shù)據(jù)因為cat2.bmp是256色的位圖,即采用了8位色深作為指向調(diào)色板數(shù)組的索引,所以根據(jù)圖5-10中顯示的數(shù)據(jù)可以得知:494949B1494949494999表示cat2.bmp位圖左下角第1個像素的顏色等于調(diào)色板[49],第2個像素的顏色等于調(diào)色板[49],第3個像素的顏色等于調(diào)色板[49],第4個像素的顏色等于調(diào)色板[B1]……依此類推。分析完cat2.bmp圖像之后,接下來分析的是cat1.bmp。cat1.bmp圖像是24位色圖像,根據(jù)BMP文件結(jié)構(gòu)定義得知,cat1.bmp圖像沒有調(diào)色板,圖像數(shù)據(jù)存儲的是實際的顏色數(shù)據(jù),每個像素用3字節(jié)表示,分別是紅綠藍。由于cat1.bmp和cat2.bmp的位圖文件頭和位圖信息頭結(jié)構(gòu)一樣,所以cat1.bmp的位圖文件頭和位圖信息頭可以參考上面對cat2.bmp的分析

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論