天天看點

BMP檔案格式

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,表示很重要

調色闆

  1. 對于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;