BMP格式詳解

2021-05-10 05:16:45 字數 4846 閱讀 4121

列舉: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 ...