位圖文件結構

一、位圖文件結構

位圖文件由三部分組成:文件頭 + 位圖信息 + 位圖像素數據

1、位圖文件頭。位圖文件頭主要用於識別位圖文件。以下是位圖文件頭結構的定義:

typedef struct tagBITMAPFILEHEADER { // bmfh 
    WORD    bfType; 
    DWORD   bfSize; 
    WORD    bfReserved1; 
    WORD    bfReserved2; 
    DWORD   bfOffBits; 
} BITMAPFILEHEADER;

其中的bfType值應該是“BM”(0x4d42),標誌該文件是位圖文件。bfSize的值是位圖文件的大小。
2、位圖信息中所記錄的值用於分配內存,設置調色板信息,讀取像素值等。
以下是位圖信息結構的定義:

 

typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER    bmiHeader;
    RGBQUAD             bmiColors[1];
} BITMAPINFO;

可見位圖信息也是由兩部分組成的:位圖信息頭 + 顏色表
2.1位圖信息頭位圖信息頭包含了單個像素所用字節數以及描述顏色的格式,此外還包括位圖的寬度、高度、目標設備的位平面數、圖像的壓縮格式。以下是位圖信息頭結構的定義:

typedef struct tagBITMAPINFOHEADER{ // bmih 
    DWORD  biSize; 
    LONG   biWidth; 
    LONG   biHeight; 
    WORD   biPlanes; 
    WORD   biBitCount 
    DWORD  biCompression; 
    DWORD  biSizeImage; 
    LONG   biXPelsPerMeter; 
    LONG   biYPelsPerMeter; 
    DWORD  biClrUsed; 
    DWORD  biClrImportant; 
} BITMAPINFOHEADER; 

下表是對結構體當中各個成員的說明:

結構成員
說 明
biSize 結構BITMAPINFOHEADER的字節數,即sizeof(BITMAPINFOHEADER)*
biWidth
以像素爲單位的圖像寬度*
biHeight
以像素爲單位的圖像長度*
biplanes
目標設備的位平面數
biBitCount
每個像素的位數*(1)
biCompression
圖像的壓縮格式(這個值幾乎總是爲0)
biSizeImage
以字節爲單位的圖像數據的大小(對BI_RGB壓縮方式而言)
biXPelsPermeter
水平方向上的每米的像素個數
biYpelsPerMeter
垂直方向上的每米的像素個數
biClrused
調色板中實際使用的顏色數(2)
biClrImportant
現實位圖時必須的顏色數(3)

說明:*是需要加以注意的部分,因爲它們是我們在進行位圖操作時經常參考的變量
(1)對於每個像素的字節數,分別有一下意義:
0,用在JPEG格式中
1,單色圖,調色板中含有兩種顏色,也就是我們通常說的黑白圖片
4,16色圖
8,256色圖,通常說的灰度圖
16,64K圖,一般沒有調色板,圖像數據中每兩個字節表示一個像素,5個或6個位表示一個RGB分量
24,16M真彩色圖,一般沒有調色板,圖像數據中每3個字節表示一個像素,每個字節表示一個RGB分量
32,4G真彩色,一般沒有調色板,每4個字節表示一個像素,相對24位真彩圖而言,加入了一個透明度,即RGBA模式

(2)這個值通常爲0,表示使用biBitCount確定的全部顏色,例外是使用的顏色樹木小於制定的顏色深度的顏色數目的最大值。

(3)這個值通常爲0,表示所有的顏色都是必需的

2.2顏色表顏色表一般是針對16位一下的圖像而設置的,對於16位和16位以上的圖像,由於其位圖像素數據中直接對對應像素的RGB(A)顏色進行描述,因而省卻了調色板。而對於16位一下的圖像,由於其位圖像素數據中記錄的只是調色板索引值,因而需要根據這個索引到調色板去取得相應的RGB(A)顏色。顏色表的作用就是創建調色板。

下圖是帶調色板和不帶調色板的位圖的簡單示意圖

圖1 帶調色板和不帶調色板位圖之間的區別

顏色表是由顏色表項組成的,顏色表項結構的定義如下:

typedef struct tagRGBQUAD { // rgbq 
    BYTE    rgbBlue; 
    BYTE    rgbGreen; 
    BYTE    rgbRed; 
    BYTE    rgbReserved; 
} RGBQUAD;

其中需要注意的問題是,RGBQUAD結構中的顏色順序是BGR,而不是平常的RGB。

3、位圖數據最後,在位圖文件頭、位圖信息頭、位圖顏色表之後,便是位圖的主體部分:位圖數據。根據不同的位圖,位圖數據所佔據的字節數也是不同的,比如,對於8位位圖,每個字節代表了一個像素,對於16位位圖,每兩個字節代表了一個像素,對於24位位圖,每三個字節代表了一個像素,對於32位位圖,每四個字節代表了一個像素。

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