BMP是bitmap的縮寫形式,bitmap顧名思義,就是位圖也即Windows位圖。它一般由4部分組成:文件頭信息塊、圖像描述信息塊、顏色表(在真彩色模式無顏色表)和圖像數據區組成。在系統中以BMP為擴展名保存。
打開Windows的畫圖程序,在保存圖像時,可以看到三個選項:2色位圖(黑白)、16色位圖、256色位圖和24位位圖。這是最普通的生成位圖的工具,在這里講解的BMP位圖形式,主要就是指用畫圖生成的位圖(當然,也可以用其它工具軟件生成)。
現在講解BMP的4個組成部分:
1.文件頭信息塊
0000-0001:文件標識,為字母ASCII碼“BM”。
0002-0005:文件大小。
0006-0009:保留,每字節以“00”填寫。
000A-000D:記錄圖像數據區的起始位置。各字節的信息依次含義為:文件頭信息塊大小,圖像描述信息塊的大小,圖像顏色表的大小,保留(為01)。
2.圖像描述信息塊
000E-0011:圖像描述信息塊的大小,常為28H。
0012-0015:圖像寬度。
0016-0019:圖像高度。
001A-001B:圖像的plane總數(恒為1)。
001C-001D:記錄像素的位數,很重要的數值,圖像的顏色數由該值決定。
001E-0021:數據壓縮方式(數值位0:不壓縮;1:8位壓縮;2:4位壓縮)。
0022-0025:圖像區數據的大小。
0026-0029:水平每米有多少像素,在設備無關位圖(.DIB)中,每字節以00H填寫。
002A-002D:垂直每米有多少像素,在設備無關位圖(.DIB)中,每字節以00H填寫。
002E-0031:此圖像所用的顏色數,如值為0,表示所有顏色一樣重要。
3.顏色表
顏色表的大小根據所使用的顏色模式而定:2色圖像為8字節;16色圖像位64字節;256色圖像為1024字節。其中,每4字節表示一種顏色,并以B(藍色)、G(綠色)、R(紅色)、alpha(32位位圖的透明度值,一般不需要)。即首先4字節表示顏色號1的顏色,接下來表示顏色號2的顏色,依此類推。
4.圖像數據區
顏色表接下來位為位圖文件的圖像數據區,在此部分記錄著每點像素對應的顏色號,其記錄方式也隨顏色模式而定,既2色圖像每點占1位(8位為1字節);16色圖像每點占4位(半字節);256色圖像每點占8位(1字節);真彩色圖像每點占24位(3字節)。所以,整個數據區的大小也會隨之變化。究其規律而言,可的出如下計算公式:圖像數據信息大小=(圖像寬度*圖像高度*記錄像素的位數)/8。
然而,未壓縮的圖像信息區的大小。除了真彩色模式外,其余的均大于或等于數據信息的大小。這是為什么呢?原因有兩個:
1.BMP文件記錄一行圖像是以字節為單位的。因此,就不存在一個字節中的數據位信息表示的點在不同的兩行中。也就是說,設顯示模式位16色,在每個字節分配兩個點信息時,如果圖像的寬度位奇數,那么最后一個像素點的信息將獨占一個字節,這個字節的后4位將沒有意義。接下來的一個字節將開始記錄下一行的信息。
2.為了顯示的方便,除了真彩色外,其他的每中顏色模式的行字節數要用數據“00”補齊為4的整數倍。如果顯示模式為16色,當圖像寬為19時,存儲時每行則要補充4-(19/2+1)%4=2個字節(加1是因為里面有一個像素點要獨占了一字節)。如果顯示模式為256色,當圖像寬為19時,每行也要補充4-19%4=1個字節。
還有一點我要申明,當屏幕初始化為16或256色模式時,一定要設置調色板或修正顏色值,否則無法得到正確的圖像顏色。
轉自http://dev.gameres.com/Program/Visual/Other/BMPFormat.htm