回覆列表
  • 1 # 使用者6338718972581

    BMP檔案的資料按照從檔案頭開始的先後順序分為四個部分:

    ◆ 點陣圖檔案頭(bmp file header): 提供檔案的格式、大小等資訊

    ◆ 點陣圖資訊頭(bitmap information):提供影象資料的尺寸、位平面數、壓縮方式、顏色索引等資訊

    ◆ 調色盤(color palette):可選,如使用索引來表示影象,調色盤就是索引與其對應的顏色的對映表

    ◆ 點陣圖資料(bitmap data):影象資料區

    BMP檔案頭結構體定義如下:

    typedef struct tagBITMAPFILEHEADER

    { UINT16 bfType; //2Bytes,必須為"BM",即0x424D 才是Windows點陣圖檔案

    DWORD bfSize; //4Bytes,整個BMP檔案的大小

    UINT16 bfReserved1; //2Bytes,保留,為0

    UINT16 bfReserved2; //2Bytes,保留,為0

    DWORD bfOffBits; //4Bytes,檔案起始位置到影象畫素資料的位元組偏移量} BITMAPFILEHEADER;

    BMP資訊頭結構體定義如下:

    typedef struct _tagBMP_INFOHEADER

    {DWORD biSize; //4Bytes,INFOHEADER結構體大小,存在其他版本I NFOHEADER,用作區分

    LONG biWidth; //4Bytes,影象寬度(以畫素為單位)

    LONG biHeight; //4Bytes,影象高度,+:影象儲存順序為Bottom2Top,-:Top2Bottom

    WORD biPlanes; //2Bytes,影象資料平面,BMP儲存RGB資料,因此總為1

    WORD biBitCount; //2Bytes,影象畫素位數

    DWORD biCompression; //4Bytes,0:不壓縮,1:RLE8,2:RLE4

    DWORD biSizeImage; //4Bytes,4位元組對齊的影象資料大小

    LONG biXPelsPerMeter; //4 Bytes,用象素/米表示的水平解析度

    LONG biYPelsPerMeter; //4 Bytes,用象素/米表示的垂直解析度

    DWORD biClrUsed; //4 Bytes,實際使用的調色盤索引數,0:使用所有的調色盤索引

    DWORD biClrImportant; //4 Bytes,重要的調色盤索引數,0:所有的調色盤索引都重要

    }BMP_INFOHEADER;

    BMP調色盤結構體定義如下:

    typedef struct _tagRGBQUAD

    {BYTE rgbBlue; //指定藍色強度

    BYTE rgbGreen; //指定綠色強度

    BYTE rgbRed; //指定紅色強度

    BYTE rgbReserved; //保留,設定為0} RGBQUAD;

    1,4,8點陣圖像才會使用調色盤資料,16,24,32點陣圖像不需要調色盤資料,即調色盤最多隻需要256項(索引0 - 255)。

    顏色表的大小根據所使用的顏色模式而定:2色影象為8位元組;16色影象位64位元組;256色影象為1024位元組。其中,每4位元組表示一種顏色,並以B(藍色)、G(綠色)、R(紅色)、alpha(32位點陣圖的透明度值,一般不需要)。即首先4位元組表示顏色號1的顏色,接下來表示顏色號2的顏色,依此類推。

    顏色表中RGBQUAD結構資料的個數有biBitCount來確定,當biBitCount=1,4,8時,分別有2,16,256個表項。

    當biBitCount=1時,為2色影象,BMP點陣圖中有2個數據結構RGBQUAD,一個調色盤佔用4位元組資料,所以2色影象的調色盤長度為2*4為8位元組。

    當biBitCount=4時,為16色影象,BMP點陣圖中有16個數據結構RGBQUAD,一個調色盤佔用4位元組資料,所以16像的調色盤長度為16*4為64位元組。

    當biBitCount=8時,為256色影象,BMP點陣圖中有256個數據結構RGBQUAD,一個調色盤佔用4位元組資料,所以256色影象的調色盤長度為256*4為1024位元組。

    當biBitCount=16,24或32時,沒有顏色表。

    BMP影象資料區

    點陣圖資料記錄了點陣圖的每一個畫素值,記錄順序是在掃描行內是從左到右,掃描行之間是從下到上。點陣圖的一個畫素值所佔的位元組數:

    當biBitCount=1時,8個畫素佔1個位元組;

    當biBitCount=4時,2個畫素佔1個位元組;

    當biBitCount=8時,1個畫素佔1個位元組;

    當biBitCount=24時,1個畫素佔3個位元組;

    Windows規定一個掃描行所佔的位元組數必須是4的倍數(即以long為單位),不足的以0填充,

    一個掃描行所佔的位元組數計算方法:

    DataSizePerLine= (biWidth* biBitCount+31)/8;

    // 一個掃描行所佔的位元組數

    DataSizePerLine= DataSizePerLine/4*4; // 位元組數必須是4的倍數

    點陣圖資料的大小(不壓縮情況下):

    DataSize= DataSizePerLine* biHeight;

    顏色表接下來位為點陣圖檔案的影象資料區,在此部分記錄著每點畫素對應的顏色號,其記錄方式也隨顏色模式而定,既2色影象每點佔1位(8位為1位元組);16色影象每點佔4位(半位元組);256色影象每點佔8位(1位元組);真彩色影象每點佔24位(3位元組)。所以,整個資料區的大小也會隨之變化。究其規律而言,可的出如下計算公式:影象資料資訊大小=(影象寬度*影象高度*記錄畫素的位數)/8。

  • 中秋節和大豐收的關聯?
  • 橡皮樹怎麼施肥,施什麼肥?