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 | |
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個位元組。
typedef struct tagPALETTENTRY
{
BYTE peRed;
BYTE peFreen;
BYTE peBlue;
BYTE peFlags;
}PALETTEENTRY;