BMP檔案結構

2022-04-07 06:37:08 字數 4618 閱讀 3730

1. 位**件頭

位**件頭包含有關於檔案型別、檔案大小、存放位置等資訊,在windows 3.0以上版本的位**件中用bitmapfileheader結構來定義:

typedef struct tagbitmapfileheader bitmapfileheader;

其中:

bftype 說明檔案的型別.(該值必需是0x4d42,也就是字元'bm'。我們不需要判斷os/2的點陣圖標識,這麼做現在來看似乎已經沒有什麼意義了,而且如果要支援os/2的點陣圖,程式將變得很繁瑣。所以,在此只建議你檢察'bm'標識)

bfsize 說明檔案的大小,用位元組為單位

bfreserved1 保留,必須設定為0

bfreserved2 保留,必須設定為0

bfoffbits 說明從檔案頭開始到實際的圖象資料之間的位元組的偏移量。這個引數是非常有用的,因為位圖資訊頭和調色盤的長度會根據不同情況而變化,所以你可以用這個偏移值迅速的從檔案中讀取到位資料。

2. 位圖資訊頭

位圖資訊用bitmapinfo結構來定義,它由位圖資訊頭(bitmap-information header)和彩色表(color table)組成,前者用bitmapinfoheader結構定義,後者用rgbquad結構定義。bitmapinfo結構具有如下形式:

typedef struct tagbitmapinfo bitmapinfo;

其中:   bmiheader 說明bitmapinfoheader結構,其中包含了有關點陣圖的尺寸及位格式等資訊

bmicolors 說明彩色表rgbquad結構的陣列,其中包含索引影象的真實rgb值。

bitmapinfoheader結構包含有位**件的大小、壓縮型別和顏色格式,其結構定義為:

typedef struct tagbitmapinfoheader bitmapinfoheader;

其中:   bisize 說明bitmapinfoheader結構所需要的字數。注:這個值並不一定是bitmapinfoheader結構的尺寸,它也可能是sizeof(bitmapv4header)的值,或是sizeof(bitmapv5header)的值。這要根據該位**件的格式版本來決定,不過,就現在的情況來看,絕大多數的bmp影象都是bitmapinfoheader結構的(可能是後兩者太新的緣故吧:-)。

biwidth 說明圖象的寬度,以象素為單位

biheight 說明圖象的高度,以象素為單位。注:這個值除了用於描述影象的高度之外,它還有另乙個用處,就是指明該影象是倒向的點陣圖,還是正向的點陣圖。如果該值是乙個正數,說明影象是倒向的,如果該值是乙個負數,則說明影象是正向的。大多數的bmp檔案都是倒向的點陣圖,也就是時,高度值是乙個正數。(注:當高度值是乙個負數時(正向影象),影象將不能被壓縮(也就是說bicompression成員將不能是bi_rle8或bi_rle4)。

biplanes 為目標裝置說明位面數,其值將總是被設為1

bibitcount 說明位元數/象素,其值為1、4、8、16、24、或32

bicompression 說明圖象資料壓縮的型別。其值可以是下述值之一: bi_rgb:沒有壓縮;

bi_rle8:每個象素8位元的rle壓縮編碼,壓縮格式由2位元組組成(重複象素計數和顏色索引);

bi_rle4:每個象素4位元的rle壓縮編碼,壓縮格式由2位元組組成

bi_bitfields:每個象素的位元由指定的掩碼決定。

bisizeimage 說明圖象的大小,以位元組為單位。當用bi_rgb格式時,可設定為0

bixpelspermeter 說明水平解析度,用象素/公尺表示 biypelspermeter 說明垂直解析度,用象素/公尺表示

biclrused 說明位圖實際使用的彩色表中的顏色索引數(設為0的話,則說明使用所有調色盤項)

biclrimportant 說明對圖象顯示有重要影響的顏色索引的數目,如果是0,表示都重要。

現就bitmapinfoheader結構作如下說明:

(1) 彩色表的定位

應用程式可使用儲存在bisize成員中的資訊來查詢在bitmapinfo結構中的彩色表,如下所示:

pcolor = ((lpstr) pbitmapinfo + (word) (pbitmapinfo->bmiheader.bisize))

(2) bibitcount

bibitcount=1 表示點陣圖最多有兩種顏色,預設情況下是黑色和白色,你也可以自己定義這兩種顏色。影象資訊頭裝調色盤中將有兩個調色盤項,稱為索引0和索引1。圖象資料陣列中的每一位表示乙個象素。如果乙個位是0,顯示時就使用索引0的rgb值,如果位是1,則使用索引1的rgb值。

bibitcount=4 表示點陣圖最多有16種顏色。每個象素用4位表示,並用這4位作為彩色表的表項來查詢該象素的顏色。例如,如果點陣圖中的第乙個位元組為0x1f,它表示有兩個象素,第一象素的顏色就在彩色表的第2表項中查詢,而第二個象素的顏色就在彩色表的第16表項中查詢。此時,調色盤中預設情況下會有16個rgb項。對應於索引0到索引15。

bibitcount=8 表示點陣圖最多有256種顏色。每個象素用8位表示,並用這8位作為彩色表的表項來查詢該象素的顏色。例如,如果點陣圖中的第乙個位元組為0x1f,這個象素的顏色就在彩色表的第32表項中查詢。此時,預設情況下,調色盤中會有256個rgb項,對應於索引0到索引255。

bibitcount=16 表示點陣圖最多有216種顏色。每個色素用16位(2個位元組)表示。這種格式叫作高彩色,或叫增強型16位色,或64k色。它的情況比較複雜,當bicompression成員的值是bi_rgb時,它沒有調色盤。16位中,最低的5位表示藍色分量,中間的5位表示綠色分量,高的5位表示紅色分量,一共占用了15位,最高的一位保留,設為0。這種格式也被稱作555 16位位圖。如果bicompression成員的值是bi_bitfields,那麼情況就複雜了,首先是原來調色盤的位置被三個dword變數佔據,稱為紅、綠、藍掩碼。分別用於描述紅、綠、藍分量在16位中所佔的位置。在windows 95(或98)中,系統可接受兩種格式的位域:555和565,在555格式下,紅、綠、藍的掩碼分別是:0x7c00、0x03e0、0x001f,而在565格式下,它們則分別為:0xf800、0x07e0、0x001f。你在讀取乙個畫素之後,可以分別用掩碼「與」上畫素值,從而提取出想要的顏色分量(當然還要再經過適當的左右移操作)。在nt系統中,則沒有格式限制,只不過要求掩碼之間不能有重疊。(注:這種格式的影象使用起來是比較麻煩的,不過因為它的顯示效果接近於真彩,而影象資料又比真彩影象小的多,所以,它更多的被用於遊戲軟體)。

bibitcount=24 表示點陣圖最多有224種顏色。這種位圖沒有調色盤(bmicolors成員尺寸為0),在位陣列中,每3個位元組代表乙個象素,分別對應於顏色r、g、b。

bibitcount=32 表示點陣圖最多有232種顏色。這種點陣圖的結構與16位位圖結構非常類似,當bicompression成員的值是bi_rgb時,它也沒有調色盤,32位中有24位用於存放rgb值,順序是:最高位—保留,紅8位、綠8位、藍8位。這種格式也被成為888 32點陣圖。如果 bicompression成員的值是bi_bitfields時,原來調色盤的位置將被三個dword變數佔據,成為紅、綠、藍掩碼,分別用於描述紅、綠、藍分量在32位中所佔的位置。在windows 95(or 98)中,系統只接受888格式,也就是說三個掩碼的值將只能是:0xff0000、0xff00、0xff。而在nt系統中,你只要注意使掩碼之間不產生重疊就行。(注:這種影象格式比較規整,因為它是dword對齊的,所以在記憶體中進行影象處理時可進行彙編級的**優化(簡單))。

(3) clrused

bitmapinfoheader結構中的成員clrused指定實際使用的顏色數目。如果clrused設定成0,位圖使用的顏色數目就等於bibitcount成員中的數目。請注意,如果clrused的值不是可用顏色的最大值或不是0,則在程式設計時應該注意調色盤尺寸的計算,比如在4位位圖中,調色盤的預設尺寸應該是16*sizeof(rgbquad),但是,如果clrused的值不是16或者不是0,那麼調色盤的尺寸就應該是clrused*sizeof(rgbquad)。

3. 彩色表

彩色表包含的元素與點陣圖所具有的顏色數相同,象素的顏色用rgbquad結構來定義。對於24-位真彩色圖象就不使用彩色表(同樣也包括16位、和32位位圖),因為點陣圖中的rgb值就代表了每個象素的rgb值。gbquad結構描述由r、g、b相對強度組成的顏色,定義如下:

typedef struct tagrgbquad rgbquad;

其中:  

rgbblue 指定藍色強度 rgbgreen 指定綠色強度 rgbred 指定紅色強度 rgbreserved 保留,設定為0

4. 位圖資料

緊跟在彩色表之後的是圖象資料位元組陣列。圖象的每一掃瞄行由表示圖象象素的連續的位元組組成,每一行的位元組數取決於圖象的顏色數目和用象素表示的圖象寬度。掃瞄行是由底向上儲存的,這就是說,陣列中的第乙個位元組表示位圖左下角的象素,而最後乙個位元組表示位圖右上角的象素。(只針對與倒向dib,如果是正向dib,則掃瞄行是由頂向下儲存的),倒向dib的原點在影象的左下角,而正向dib的原點在影象的左上角。同時,每一掃瞄行的位元組數必需是4的整倍數,也就是dword對齊的。如果你想確保影象的掃瞄行dword對齊,可使用下面的**:

(((width*bibitcount)+31)>>5)<<2

摘自:

BMP檔案結構

1.bmp檔案組成 bmp檔案由檔案頭 位圖資訊頭 顏色資訊和圖形資料四部分組成。2.bmp檔案頭 bmp檔案頭資料結構含有bmp檔案的型別 檔案大小和點陣圖起始位置等資訊。其結構定義如下 typedef struct tagbitmapfileheader bitmapfileheader 3.位...

BMP檔案結構

1.bmp檔案組成 bmp檔案由檔案頭 位圖資訊頭 顏色資訊和圖形資料四部分組成。2.bmp檔案頭 bmp檔案頭資料結構含有bmp檔案的型別 檔案大小和點陣圖起始位置等資訊。其結構定義如下 typedef struct tagbitmapfileheader bitmapfileheader 3.位...

BMP檔案結構

平常我們常見的 bmp檔案即位 件,又稱dib裝置無關位圖,是相對於系統記憶體中使用的ddb裝置相關位圖而言的.一 位 件頭 bitmapfileheader struct bftype word 檔案標識,必須是 bm bfsize dword 位 件大小,以位元組為單位 bfreserved1 ...