BMP(Bitmap-File)圖像文件,又叫位圖文件,是Windows采用的圖形文件格式,在Windows環境下運行的所有圖像處理軟件都支持BMP圖像文件格式。Windows系統內部個圖像繪制操作以BMP為基礎的。一個BMP文件由四個部分組成。
- l 位圖文件頭
- l 位圖信息段
- l 調色板
- l 位圖數據
一個BMP文件,可以用代碼表示,如下:
typedef struct tagBITMAP_FILE { BITMAPFILEHEADER bitmapheader; BITMAPINFOHEADER bitmapinfoheader; PALETTEENTRY palette[256]; UCHAR *buffer; //UCHAR大小1字節(通BYTE) }BITMAP_FILE;
BMP文件頭:BITMAPFILEHEADER
typedef struct tagBITMAPFILEHEADER{ WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffbits; }
bfType |
說明文件的類型,該值必須是0x4D42,也就是字符‘BM’,否則表示根本不是BMP |
bfSize |
說明位圖文件的大小,用字節為單位 |
bfReserved1 |
保留,必須設置為0 |
bfReserved2 |
保留,必須設置為0 |
bfOffBits |
說明從文件頭開始到實際的圖像數據之間的字節的偏移量。因為位圖信息頭和調色板的長度會根據不同情況而變化,所以需要用這個偏移值迅速的從文件中讀取到為數據 |
位圖信息段:BITMAPINFOHEADER
typedef struct tagBITMAPINFOHEADER { DWORD bitSize; LONG bitWidth; LONG biHeight; WORD biPlanes; WORD bitBitCount; DWORD bitCompression; DWORD bitSizeImage; LONG bitXPelsPerMeter; LONG bitYPelsPerMeter; DWORD biClrUsed; DWORD biClrImporant; }BITMAPINFOHEADER;
bitSize |
說明BITMAPINFOHEADER結構所需要的字節數 |
bitWidth |
說明像素的寬度,以像素為單位 |
biHeight |
說了像素的高度,以像素位單位。 這個值還說明該圖像是倒立的圖還是正向的圖。 如果該值是整數,說明圖像是倒向的,即:數據的第一行其實是圖像的最后一行 如果該值是一個負值,則圖像是正向的。 大多數的BMF文件都是倒立的,也就是說,高度值是一個正數 |
biPlanes |
表示bmp圖片的平面屬,顯然顯示器只有一個平面,所以恆為1 |
bitBitCount |
說明比特數/像素,其值為1、4、8、16、24、32 |
bitCompression |
說明圖像壓縮的類型,其中: BI_RGB:沒有壓縮 BI_RLE8:每個像素8比特的RLE壓縮編碼,壓縮格式由2字節組成 BI_RLE4:每個像素4比特的RLE壓縮編碼,壓縮格式由2字節組成 BI_BITFIELDS:每個像素的比特由指定的掩碼決定 BI_JPEG:JPEG格式 |
bitSizeImage |
說明圖像的大小,以字節為單位。當用BI_RGB格式時,可以設置為0 |
bitXPelsPerMeter |
說明水平分辨率,用像素/米表示 |
bitYPelsPerMeter |
說明垂直分辨率,用像素/米表示 |
biClrUsed |
說明位圖實際使用的彩色表中的顏色索引數(0表示使用所以的調色版項) |
biClrImporant |
說明對圖像顯示有重要影響的顏色索引的數目,如果是0,表示很重要 |
調色板
- 對於200*200像素,顏色數為16的彩色圖。每個像素用R、G、B三個分量表示,每個分量有256個級別,用8位,也就是一個字節,所有每個像素就要用到3個字節。整個圖像就要用200*200*3的大小內存來存儲。
如果16色圖在途中最多有16種顏色。可以采用一個表,表中每一行記錄一種顏色的R、G、B值。這樣當我們表示一個色素的顏色時,只需要指出該顏色在第幾行,即該顏色的索引值即可。比如如果表第0行表示255,0,0(紅色),那么當某個色素為紅色時,只需要標注0即可。
16種顏色用4bit表示,所以一個像素只需要用到半個字節。整個圖像只用200*200*0.5+3*16個字節。
這張R、G、B表就是調色板,另一種叫法是顏色查找表。
typedef struct tagPALETTENTRY { BYTE peRed; BYTE peFreen; BYTE peBlue; BYTE peFlags; }PALETTEENTRY;