BMP是bitmap的縮寫(xiě)形式,bitmap顧名思義,就是位圖也即Windows位圖。它一般由4部分組成:文件頭信息塊、圖像描述信息塊、顏色表(在真彩色模式無(wú)顏色表)和圖像數(shù)據(jù)區(qū)組成。在系統(tǒng)中以BMP為擴(kuò)展名保存。
打開(kāi)Windows的畫(huà)圖程序,在保存圖像時(shí),可以看到三個(gè)選項(xiàng):2色位圖(黑白)、16色位圖、256色位圖和24位位圖。這是最普通的生成位圖的工具,在這里講解的BMP位圖形式,主要就是指用畫(huà)圖生成的位圖(當(dāng)然,也可以用其它工具軟件生成)。
現(xiàn)在講解BMP的4個(gè)組成部分:
1.文件頭信息塊
0000-0001:文件標(biāo)識(shí),為字母ASCII碼“BM”。
0002-0005:文件大小。
0006-0009:保留,每字節(jié)以“00”填寫(xiě)。
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è)備無(wú)關(guān)位圖(.DIB)中,每字節(jié)以00H填寫(xiě)。
002A-002D:垂直每米有多少像素,在設(shè)備無(wú)關(guān)位圖(.DIB)中,每字節(jié)以00H填寫(xiě)。
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é)表示顏色號(hào)1的顏色,接下來(lái)表示顏色號(hào)2的顏色,依此類(lèi)推。
4.圖像數(shù)據(jù)區(qū)
顏色表接下來(lái)位為位圖文件的圖像數(shù)據(jù)區(qū),在此部分記錄著每點(diǎn)像素對(duì)應(yīng)的顏色號(hào),其記錄方式也隨顏色模式而定,既2色圖像每點(diǎn)占1位(8位為1字節(jié));16色圖像每點(diǎn)占4位(半字節(jié));256色圖像每點(diǎn)占8位(1字節(jié));真彩色圖像每點(diǎn)占24位(3字節(jié))。所以,整個(gè)數(shù)據(jù)區(qū)的大小也會(huì)隨之變化。究其規(guī)律而言,可的出如下計(jì)算公式:圖像數(shù)據(jù)信息大小=(圖像寬度*圖像高度*記錄像素的位數(shù))/8。
然而,未壓縮的圖像信息區(qū)的大小。除了真彩色模式外,其余的均大于或等于數(shù)據(jù)信息的大小。這是為什么呢?原因有兩個(gè):
1.BMP文件記錄一行圖像是以字節(jié)為單位的。因此,就不存在一個(gè)字節(jié)中的數(shù)據(jù)位信息表示的點(diǎn)在不同的兩行中。也就是說(shuō),設(shè)顯示模式位16色,在每個(gè)字節(jié)分配兩個(gè)點(diǎn)信息時(shí),如果圖像的寬度位奇數(shù),那么最后一個(gè)像素點(diǎn)的信息將獨(dú)占一個(gè)字節(jié),這個(gè)字節(jié)的后4位將沒(méi)有意義。接下來(lái)的一個(gè)字節(jié)將開(kāi)始記錄下一行的信息。
2.為了顯示的方便,除了真彩色外,其他的每中顏色模式的行字節(jié)數(shù)要用數(shù)據(jù)“00”補(bǔ)齊為4的整數(shù)倍。如果顯示模式為16色,當(dāng)圖像寬為19時(shí),存儲(chǔ)時(shí)每行則要補(bǔ)充4-(19/2+1)%4=2個(gè)字節(jié)(加1是因?yàn)槔锩嬗幸粋€(gè)像素點(diǎn)要獨(dú)占了一字節(jié))。如果顯示模式為256色,當(dāng)圖像寬為19時(shí),每行也要補(bǔ)充4-19%4=1個(gè)字節(jié)。
還有一點(diǎn)我要申明,當(dāng)屏幕初始化為16或256色模式時(shí),一定要設(shè)置調(diào)色板或修正顏色值,否則無(wú)法得到正確的圖像顏色。
轉(zhuǎn)自http://dev.gameres.com/Program/Visual/Other/BMPFormat.htm