列舉:c:/windows/blue lace 16.bmp
位**件頭的格式:
typedef structbitmapfileheader;//檔案頭結構體,14位元組
typedef structbitmapinfoheader;//位圖資訊頭,40位元組
bmp檔案詳解(2)2007-03-21 12:26乙個bmp檔案以bitmapfileheader結構體開始,bitmapfileheader的第1個屬性是bftype(2位元組),這裡 恆定等於&h4d42。由於記憶體中的資料排列高位在左,低位在右,所以記憶體中從左往右看就顯示成(42 4d),所以在ultraedit中頭兩個 位元組顯示為(42 4d)就是這樣形成的,以後的資料都是這個特點,不再作重複說明。
bitmapfileheader的第2個屬性是bfsize(4位元組),表示整個bmp檔案的大小,這裡等於&h000004f8=1272位元組。
bitmapfileheader的第3個、第4個屬性分別是bfreserved1、bfreserved2(各2位元組),這裡是2個保留屬性,都為0,這裡等於&h0000、&h0000。
bitmapfileheader的第5個屬性是bfoffbits(4位元組),表示dib資料區在bmp檔案中的位置偏移量,這裡等於&h00000076=118,表示資料區從檔案開始往後數的118位元組開始。
bitmapfileheader結構體這裡就講完了,大家會發現bitmapfileheader只佔了bmp檔案開始的14位元組長度,但需要 特別說明的是在vb中定義乙個bitmapfileheader結構體變數,其長度佔了16個位元組,原因就是第1個屬性本來應該只分配2個位元組,但實際被 分配了4個位元組,多出來2個位元組,所以如果想儲存一張bmp,寫入bitmapfileheader結構體時一定要注意這一點。
接下來是bitmapinfo結構體部分。bitmapinfo段由兩部分組成:bitmapinfoheader結構體和rgbquad結構 體。其中rgbquad結構體表示的顏色資訊,有些時候可以省略,一般的24位和32位都不帶rgbquad結構體,因為dib資料區直接表 示的rgb值,一般4位和8位才帶有rgbquad結構體。(多少位的就是用多少位來表示乙個顏色資訊,例如4位表示用4個bit來表示 乙個顏色資訊。)乙個bmp檔案中有沒有rgbquad結構體,可以根據前面bitmapfileheader結構體的第5個屬性bfoffbits來判 斷,因為bitmapinfoheader結構體長度為40bit,如果bitmapinfoheader結構體結束後還未到dib資料區的偏移量,就說 明接下來的資料是rgbquad結構體部分。這裡講的c:/windows/blue lace 16.bmp是乙個4bit,所以它帶有 rgbquad結構體。
下面進入正題bitmapinfoheader部分。
bitmapinfoheader的第1個屬性是bisize(4位元組),表示bitmapinfoheader結構體的長度,最常見的長度是40位元組,ultraedit中可以看到緊接著的4個位元組等於&h00000028=40位元組。
bitmapinfoheader的第2個屬性是biwidth(4位元組),表示bmp的寬度,這裡等於&h00000030=48畫素。
bitmapinfoheader的第3個屬性是biheight(4位元組),表示bmp的高度,這裡等於&h00000030=48畫素。
bitmapinfoheader的第4個屬性是biplanes(2位元組),表示bmp的平面屬,顯然顯示器只有乙個平面,所以恆等於1,這裡等於&h0001。
bitmapinfoheader的第5個屬性是bibitcount(2位元組),表示bmp的顏色位數,即24點陣圖、32點陣圖等等。這裡等於&h0004,表示該為4點陣圖。
bitmapinfoheader的第6個屬性是bicompression(4位元組),表示的壓縮屬性,bmp是不壓縮的,等於0,所以這裡為&h00000000。
bitmapinfoheader的第7個屬性是bisizeimage(4位元組),表示bmp資料區的大小,當上乙個熟悉bicompression等於0時,這裡的值可以省略不填,所以這裡等於&h00000000。
bitmapinfoheader的第8個屬性是bixpelspermeter(4位元組),表示x軸每公尺多少畫素,可省略,這裡等於&h00000ec3=3779畫素/公尺。
bitmapinfoheader的第9個屬性是biypelspermeter(4位元組),表示y軸每公尺多少畫素,可省略,這裡等於&h00000ec3=3779畫素/公尺。
bitmapinfoheader的第10個屬性是biclrused(4位元組),表示使用了多少個顏色索引表,一般bibitcount屬性小於16才會用到,等於0時表示有2^bibitcount個顏色索引表,所以這裡仍等於&h00000000。
bitmapinfoheader的第11個屬性是biclrimportant(4位元組),表示有多少個重要的顏色,等於0時表示所有顏色都很重要,所以這裡等於&h00000000。
至此bitmapinfoheader結構體結束。
由於這個到這裡還未到達dib資料區的偏移量,所以接下來的部分是rgbquad結構體。rgbquad結構體由4個位元組型資料組成,所以一 個rgbquad結構體只占用4位元組空間,從左到右每個位元組依次表示(藍色,綠色,紅色,未使用)。舉例的這個我數了數總共有16個rgbquad結 構體,由於該是4點陣圖,2^4正好等於16,所以它把16種顏色全部都列舉出來了,這些顏色就是乙個顏色索引表。顏色索引表編號從0開始,總共16個 顏色,所以編號為0-15。從ultraedit中可以看到按照順序,這16個rgbquad結構體依次為:
編號:(藍,綠,紅,空)
0號:(00,00,00,00)
1號:(00,00,80,00)
2號:(00,80,00,00)
3號:(00,80,80,00)
4號:(80,00,00,00)
5號:(80,00,80,00)
6號:(80,80,00,00)
7號:(80,80,80,00)
8號:(c0,c0,c0,00)
9號:(00,00,ff,00)
10號:(00,ff,00,00)
11號:(00,ff,ff,00)
12號:(ff,00,00,00)
13號:(ff,00,ff,00)
14號:(ff,ff,00,00)
15號:(ff,ff,ff,00)
為了更直觀的表示這些顏色,可以見後面的。
到這裡,正好滿足dib資料區的偏移量,所以後面的位元組就是內容了。這裡需要提醒的是所有的dib資料掃瞄行是上下顛倒的,也就是說一幅先繪製底部的畫素,再繪製頂部的畫素,所以這些dib資料所表示的畫素點就是從的左下角開始,一直表示到的右上角。
由於這裡的是4位,也就是說4bit就表示乙個畫素,乙個位元組有8個bit,所以乙個位元組能表示2個畫素。
從ultraedit中可以看到,dib資料區第乙個位元組是&h44,16進製制正好是將2進製數每4個一組書寫的,跟4bit正好吻 合,所以&h44表示兩個畫素,高位的4表示第乙個畫素,低位的4表示第二個畫素。這裡的4不是表示rgb顏色,而是表示顏色索引號為4,由於索 引號從0開始編號的,所以4表示索引表中第5個顏色,從附圖中可以看到索引號為4的是藍色。這是第一位元組,表示的是左下角開始2個畫素,如果有 photoshop開啟這個可以看到,左下角2個畫素取出來的顏色rgb值正好等於索引表中第5個顏色的rgb值。後面的dib資料以此類推。
至此乙個bmp就全部解析完了,根據這些資訊就可以完整的繪製一張bmp來。
****************************************====
如果你還不明白,還有:
1. bmp檔案組成
bmp檔案由檔案頭、位圖資訊頭、顏色資訊和圖形資料四部分組成。
2. bmp檔案頭
bmp檔案頭資料結構含有bmp檔案的型別、檔案大小和點陣圖起始位置等資訊。
其結構定義如下:
typedef struct tagbitmapfileheader
bitmapfileheader;
3. 位圖資訊頭
bmp點陣圖資訊頭資料用於說明點陣圖的尺寸等資訊。
typedef struct tagbitmapinfoheader bitmapinfoheader;
4. 顏色表
顏色表用於說明點陣圖中的顏色,它有若干個表項,每乙個表項是乙個rgbquad型別的結構,定義一種顏色。rgbquad結構的定義如下:
typedef struct tagrgbquad rgbquad;
顏色表中rgbquad結構資料的個數有bibitcount來確定:
當bibitcount=1,4,8時,分別有2,16,256個表項;
當bibitcount=24時,沒有顏色表項。
位圖資訊頭和顏色表組成位圖資訊,bitmapinfo結構定義如下:
typedef struct tagbitmapinfo bitmapinfo;
5. 位圖資料
位圖資料記錄了點陣圖的每乙個畫素值,記錄順序是在掃瞄行內是從左到右,掃瞄行之間是從下到上。點陣圖的乙個畫素值所佔的位元組數:
當bibitcount=1時,8個畫素佔1個位元組;
當bibitcount=4時,2個畫素佔1個位元組;
當bibitcount=8時,1個畫素佔1個位元組;
當bibitcount=24時,1個畫素佔3個位元組;
windows規定乙個掃瞄行所佔的位元組數必須是
4的倍數(即以long為單位),不足的以0填充,
乙個掃瞄行所佔的位元組數計算方法:
datasizeperline= (biwidth* bibitcount+31)/8;
// 乙個掃瞄行所佔的位元組數
datasizeperline= datasizeperline/4*4; // 位元組數必須是4的倍數
位圖資料的大小(不壓縮情況下):
datasize= datasizeperline* biheight
BMP格式詳解
bmp 全稱bitmap 是windows作業系統中的標準影象檔案格式,可以分成兩類 裝置相關位圖 ddb 和裝置無關位圖 dib 使用非常廣。它採用位對映儲存格式,除了影象深度可選以外,不採用其他任何壓縮,因此,bmp檔案所占用的空間很大。bmp檔案的影象深度可選lbit 4bit 8bit及24...
BMP格式詳解
bmp檔案的資料按照從檔案頭開始的先後順序分為四個部分 1 bmp檔案頭 bmp file header 提供檔案的格式 大小等資訊 2 位圖資訊頭 bitmap information 提供影象資料的尺寸 位平面數 壓縮方式 顏色索引等資訊 3 調色盤 color palette 可選,如使用索引...
關於BMP檔案格式的詳解
什麼是bmp bmp 全稱bitmap 是windows作業系統中的標準影象檔案格式,可以分成兩類 裝置相關位圖 ddb 和裝置無關位圖 dib 使用非常廣。它採用位對映儲存格式,除了影象深度可選以外,不採用其他任何壓縮,因此,bmp檔案所占用的空間很大。bmp檔案的影象深度可選lbit 4bit ...