BMP檔案格式

2021-04-12 22:12:12 字數 2509 閱讀 3003

bmp檔案格式

bmp檔案大體上分成四個部分,如圖1所示。

位**件頭bitmapfileheader

位圖資訊頭bitmapinfoheader

調色盤(palette)

圖象資料

圖1. windows位**件結構示意圖

第一部分為位**件頭bitmapfileheader,是乙個結構,其定義如下:

typedef struct tagbitmapfileheader bitmapfileheader;

這個結構的長度是固定的,為14個位元組(word為無符號16位整數,dword為無符號32位整數),各個域的說明如下:

bftype

指定檔案型別,必須是0x424d,即字串」bm」,也就是說所有.bmp檔案的頭兩個位元組都是」bm」

bfsize

指定檔案大小,包括這14個位元組

bfreserved1

,bfreserved2

為保留字,不用考慮

bfoffbits

為從檔案頭到實際的點陣圖資料的偏移位元組數,即圖1中前三個部分的長度之和。

第二部分為位圖資訊頭bitmapinfoheader,也是乙個結構,其定義如下:

typedef struct tagbitmapinfoheader bitmapinfoheader;

這個結構的長度是固定的,為40個位元組(word為無符號16位整數,dword無符號32位整數,long為32位整數),各個域的說明如下:

bisize

指定這個結構的長度,為40

biwidth

指定圖象的寬度,單位是象素

biheight

指定圖象的高度,單位是象素

biplanes

必須是1,不用考慮

bibitcount

指定表示顏色時要用到的位數,常用的值為1(黑白二色圖), 4(16色圖), 8(256色), 24(真彩色圖)(新的.bmp格式支援32位色,這裡就不做討論了)。

bicompression

指定位圖是否壓縮,有效的值為bi_rgb,bi_rle8,bi_rle4,bi_bitfields(都是一些windows定義好的常量)。要說明的是,windows點陣圖可以採用rle4,和rle8的壓縮格式,但用的不多。我們今後所討論的只有第一種不壓縮的情況,即bicompression為bi_rgb的情況。

bisizeimage

指定實際的點陣圖資料占用的位元組數,其實也可以從以下的公式中計算出來:bisizeimage=biwidth』 * biheight

要注意的是:上述公式中的biwidth』必須是4的整倍數(所以不是biwidth,而是biwidth』,表示大於或等於biwidth的,離4最近的整倍數。舉個例子,如果biwidth=240,則biwidth』=240;如果biwidth=241,biwidth』=244)

如果bicompression為bi_rgb,則該項可能為零

bixpelspermeter

指定目標裝置的水平解析度,單位是每公尺的象素個數,關於解析度的概念,我們將在列印部分詳細介紹。

biypelspermeter

指定目標裝置的垂直解析度,單位同上。

biclrused

指定本圖象實際用到的顏色數,如果該值為零,則用到的顏色數為2的bibitcount次方。

biclrimportant

指定本圖象中重要的顏色數,如果該值為零,則認為所有的顏色都是重要的。

第三部分為調色盤(palette),當然,這裡是對那些需要調色盤的位**件而言的。有些位圖,如真彩色圖,前面已經講過,是不需要調色盤的,bitmapinfoheader後直接是點陣圖資料。

調色盤實際上是乙個陣列,共有biclrused個元素(如果該值為零,則有2的bibitcount次方個元素)。陣列中每個元素的型別是乙個rgbquad結構,佔4個位元組,其定義如下:

typedef struct tagrgbquad rgbquad;

第四部分就是實際的圖象資料了。對於用到調色盤的點陣圖,圖象資料就是該畫素顏在調色盤中的索引值,對於真彩色圖,圖象資料就是實際的r,g,b值。下面就2色,16色,256色位圖和真彩色位圖分別介紹。

對於2色位圖,用1位就可以表示該畫素的顏色(一般0表示黑,1表示白),所以乙個位元組可以表示8個畫素。

對於16色位圖,用4位可以表示乙個畫素的顏色,所以乙個位元組可以表示2個畫素。

對於256色位圖,乙個位元組剛好可以表示1個畫素。

對於真彩色圖,三個位元組才能表示1個畫素。

要注意兩點: 1

.每一行的位元組數必須是4的整倍數,如果不是,則需要補齊。 2

.一般來說,.bmp檔案的資料從下到上,從左到右的。也就是說,從檔案中最先讀到的是圖象最下面一行的左邊第乙個畫素,然後是左邊第二個畫素。。。接下來是倒數第二行左邊第乙個畫素,左邊第二個畫素。。。依次類推,最後得到的是最上面一行的最右乙個畫素。

BMP檔案格式

典型的位 件格式通常包含下面幾個資料塊 下面的部分將會詳細地描述位 件中儲存的資料。需要注意的是這是標準點陣圖的檔案格式,其他一些位圖影象可能根據生成檔案的應用程式不同所使用格式可能會有細微的區別。這部分是識別資訊,典型的應用程式會首先普通讀取這部分資料以確保的確是位 件並且沒有損壞。這部分告訴應用...

BMP檔案格式

位置 大小 說明 0000h 2 bm 檔案標識 0002h 4 檔案大小 0006h 4 保留 0 000ah 4 從檔案開始到位圖資料之間的偏移量 000eh 4 位圖資訊頭,用來描述點陣圖的顏色 壓縮方法等。0012h 4 點陣圖的寬度,以象素為單位 0016h 4 點陣圖的高度,以象素為單位...

BMP檔案格式

include include include typedef short int16 typedef int int32 typedef unsigned int uint32 typedef unsigned char byte bmp 檔案頭,14個位元組 typedef struct sbm...