一、位圖文件結構
位圖文件由三部分組成:文件頭 + 位圖信息 + 位圖像素數據
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位位圖,每四個字節代表了一個像素。