關於位圖文件的理解

第一部分爲位圖文件頭BITMAPFILEHEADER,是一個結構,其定義如下:

typedef struct tagBITMAPFILEHEADER {

WORD           bfType;

DWORD bfSize;

WORD           bfReserved1;

WORD           bfReserved2;

DWORD bfOffBits;

} BITMAPFILEHEADER;

這個結構的長度是固定的,14個字節(WORD爲無符號16位整數,DWORD爲無符號32位整數),各個域的說明如下:

bfType

指定文件類型,必須是0x424D,即字符串“BM”,也就是說所有.bmp文件的頭兩個字節都是“BM”。

bfSize

指定文件大小,包括這14個字節。

bfReserved1,bfReserved2     

爲保留字,不用考慮

bfOffBits

爲從文件頭到實際的位圖數據的偏移字節數,即圖1.3中前三個部分的長度之和。

第二部分爲位圖信息頭BITMAPINFOHEADER,也是一個結構,其定義如下:

typedef struct tagBITMAPINFOHEADER{

DWORD  biSize;

LONG            biWidth;

LONG            biHeight;

WORD           biPlanes;

WORD           biBitCount

DWORD  biCompression;

DWORD  biSizeImage;

LONG            biXPelsPerMeter;

LONG            biYPelsPerMeter;

DWORD  biClrUsed;

DWORD  biClrImportant;

} BITMAPINFOHEADER;

這個結構的長度是固定的,爲40個字節(LONG32位整數),各個域的說明如下:

biSize

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

biWidth

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

biHeight

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

biPlanes

必須是1,不用考慮。

biBitCount

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

biCompression

指定位圖是否壓縮,有效的值爲BI_RGBBI_RLE8BI_RLE4BI_BITFIELDS(都是一些Windows定義好的常量)。要說明的是,Windows位圖可以採用RLE4,和RLE8的壓縮格式,但用的不多。我們今後所討論的只有第一種不壓縮的情況,即biCompressionBI_RGB的情況。

biSizeImage

指定實際的位圖數據佔用的字節數,其實也可以從以下的公式中計算出來:

biSizeImage=biWidth’ × biHeight

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

如果biCompressionBI_RGB,則該項可能爲零

biXPelsPerMeter

指定目標設備的水平分辨率,單位是每米的象素個數,關於分辨率的概念,我們將在第4章詳細介紹。

biYPelsPerMeter

指定目標設備的垂直分辨率,單位同上。

biClrUsed

指定本圖象實際用到的顏色數,如果該值爲零,則用到的顏色數爲2biBitCount

biClrImportant

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

第三部分爲調色板Palette,當然,這裏是對那些需要調色板的位圖文件而言的。有些位圖,如真彩色圖,前面已經講過,是不需要調色板的,BITMAPINFOHEADER後直接是位圖數據。

調色板實際上是一個數組,共有biClrUsed個元素(如果該值爲零,則有2biBitCount個元素)。數組中每個元素的類型是一個RGBQUAD結構,佔4個字節,其定義如下:

typedef struct tagRGBQUAD {

BYTE    rgbBlue; //該顏色的藍色分量

BYTE    rgbGreen; //該顏色的綠色分量

BYTE    rgbRed; //該顏色的紅色分量

BYTE    rgbReserved; //保留值

} RGBQUAD;

第四部分就是實際的圖象數據了。對於用到調色板的位圖,圖象數據就是該象素顏在調色板中的索引值。對於真彩色圖,圖象數據就是實際的RGB值。下面針對2色、16色、256色位圖和真彩色位圖分別介紹。

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

對於16色位圖,用4位可以表示一個象素的顏色,所以一個字節可以表示2個象素。

對於256色位圖,一個字節剛好可以表示1個象素。

對於真彩色圖,三個字節才能表示1個象素,哇,好費空間呀!沒辦法,誰叫你想讓圖的顏色顯得更亮麗呢,有得必有失嘛。

要注意兩點:

(1)    每一行的字節數必須是4的整倍數,如果不是,則需要補齊。這在前面介紹biSizeImage時已經提到了。

(2)    一般來說,.bMP文件的數據從下到上,從左到右的。也就是說,從文件中最先讀到的是圖象最下面一行的左邊第一個象素,然後是左邊第二個象素……接下來是倒數第二行左邊第一個象素,左邊第二個象素……依次類推 ,最後得到的是最上面一行的最右一個象素。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章