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

保留,必須設置為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,表示很重要

調色板

  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個字節。

 

這張R、G、B表就是調色板,另一種叫法是顏色查找表。

typedef struct tagPALETTENTRY
{
        BYTE peRed;
        BYTE peFreen;
        BYTE peBlue;
        BYTE peFlags;
}PALETTEENTRY;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM