位圖文檔

http://blog.chinaunix.net/uid-8481993-id-2460678.html

位圖文檔

 

 BMP文件由文件頭、位圖信息頭、顏色信息和圖形數據四部分組成。

一.理論基礎

1.

typedef  struct  tagBITMAP

  {

    LONG        bmType;

    LONG        bmWidth;

    LONG        bmHeight;

    LONG        bmWidthBytes;

    WORD        bmPlanes;

    WORD        bmBitsPixel;

    LPVOID       bmBits;

  } BITMAP;

該結構定義了一幅位圖的高、寬、顏色格式以及位值。

       bmType 必須爲0;

       bmWidth,bmHeight 位圖寬高(單位:象素);

       bmWidthBytes 每一光柵行的字節數,必須爲偶數,因爲GDI假定位圖的位數組是字(16bit)對齊;

       bmPlanes 位圖的顏色平面數;

       bmBitsPixel 指定每個象素需要多少位;

       bmBits 指向位圖位值的地址,必須是一個指向字符數組的指針。

 

 

2.

typedef struct tagBITMAPCOREHEADER

  {

    DWORD   bcSize;             /* used to get to color table */

    WORD    bcWidth;

    WORD    bcHeight;

    WORD    bcPlanes;

    WORD    bcBitCount;

              } BITMAPCOREHEADER;

該結構包含了設備無關位圖的大小和顏色格式的信息。

       bcSize 指定該結構本身所需要的字節數;

       bcWidth,bcHeight 位圖的寬高(單位:象素);

       bcPlanes 指定目標設備的平面數(必須爲1);

       bcBitCount 指定每一個象素的位數,此值必須爲1、4、8 或24。(我們這裏8色,則必須設置該數字爲4)

 

 

3.

typedef struct tagRGBTRIPLE

  {

    BYTE    rgbtBlue;

    BYTE    rgbtGreen;

    BYTE    rgbtRed;

  } RGBTRIPLE;

 

typedef struct _BITMAPCOREINFO

  {

     BITMAPCOREHEADER  bmciHeader;

     RGBTRIPLE         bmciColor[1];

  }  BITMAPCOREINFO;

該結構完整地定義了設備無關位圖的大小和顏色信息。

       bmciHeader 指定了一個數據結構,它包含了設備無關位圖的大小和顏色信息;

       bmciColor[1] 指定了一個結構,它定義了位圖中的顏色。

一個應用程序可以利用bcSize成員中的信息來定位BITMAPCOREINFO結構中的顏色表,具體方法如下:

       pColor = ((LPBYTE)pBitmapCoreInfo + (WORD)(pBitmapCoreInfo->bmciHeader.bcSize))

 

 

4.

typedef struct tagBITMAPFILEHEADER

  {

    WORD    bfType;

    DWORD   bfSize;

    WORD    bfReserved1;

    WORD    bfReserved2;

    DWORD   bfOffBits;

  } BITMAPFILEHEADER;

該結構包含了設備無關位圖文件的類型、大小、佈局等信息。

       bfType 指定文件類型,必須爲BM;

       bfSize 以字節爲單位指定文件大小;

       bfReserved1 必須爲0;

       bfReserved2 必須爲0;

       bfOffBits 指定位圖文件中實際位圖偏移於BITMAPFILEHEADER的字節數。

 

 

5.

typedef struct tagRGBQUAD

  {

    BYTE    rgbBlue;

    BYTE    rgbGreen;

    BYTE    rgbRed;

    BYTE    rgbReserved;

  } RGBQUAD;

 

typedef struct tagBITMAPINFO

  {

    BITMAPINFOHEADER    bmiHeader;

    RGBQUAD              bmiColors[1];

  } BITMAPINFO;

該結構定義了設備無關位圖的大小和顏色等信息。

       bmiHeader 指定了一個結構,該結構包含了設備無關位圖的大小和顏色格式等信息;

       bmiColors[1] 指定了一個結構,該結構定義了位圖中的顏色。

 

 

6.

typedef struct tagBITMAPINFOHEADER{

        DWORD      biSize;

        LONG       biWidth;

        LONG       biHeight;

        WORD       biPlanes;

        WORD       biBitCount;

        DWORD      biCompression;

        DWORD      biSizeImage;

        LONG       biXPelsPerMeter;

        LONG       biYPelsPerMeter;

        DWORD      biClrUsed;

        DWORD      biClrImportant;

BITMAPINFOHEADER

該結構包含了設備無關位圖的大小和顏色信息。

       biSize 該結構所需的字節數;

       biWidth, biHeight 位圖寬高;

       biPlanes 目標設備平面數,必須爲1;

       biBItCount 指定每個象素的位數,必須爲1、4、8、或24;

       biCompression 指定位圖的壓縮類型,必須爲BI_RGB,BI_RGB8,或BI_RLE4;

       biSizeImage 圖像的字節大小;

       biXPelsPerMeter, biYPelsPerMeter 位圖的目標設備的水平、垂直分辨率(每米象素數);

       biClrUsed 指定位圖所實際使用的顏色表中的顏色數;

       biClrImportant 指定顯示位圖中重要的顏色索引數,0:所有顏色均是重要的。

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//                                                                                                                              //

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

二、實際應用

1.文件結構

 

位圖文件數據存儲結構(字節單位):

 

       前14字節(BITMAPFILEHEADER 文件頭數據結構)

       詳細結構參考上面文檔。

 

       之後40字節(BITMAPINFOHEADER 位圖信息頭數據結構)

       詳細結構參考上面文檔。

 

       之後  調色板數據

只有小於等於8位象素才需要調色板,

 

       最後,位圖數據

       大小:象素寬 × 象素高 × 每象素字節數

      

 

       注意:位圖文件中的顏色格式與平時的顏色組織格式稍有不同,它的顏色格式是

       藍色 blue

       綠色 green

       紅色 red

 

       平時的是 Red,Greed,Blue

 

2. 例子附帶說明

   關於位圖文件內部數據是怎麼組織的?關鍵是看參數biBitCount的值,該參數只有5個可選值1、4、8、24、32。根據它們的選值情況,文件有3種組織格式,下面分別用例子說明:

       公共部分:文件頭

       前面14個字節,

typedef struct tagBITMAPFILEHEADER

 {

    WORD    bfType;  //必填“BM”或“0x4D42

    DWORD   bfSize;  //必填 文件總的字節大小

    WORD    bfReserved1;//必填 0

    WORD    bfReserved2;//必填 0

    DWORD   bfOffBits;      //必填,象素值開始位置到文件頭位置的偏移量

  } BITMAPFILEHEADER;

 

       接着40個字節,

typedef struct tagBITMAPINFOHEADER

{

  DWORD      biSize; //必填 0x28

   LONG       biWidth; //必填 象素寬

   LONG       biHeight; //必填 象素高

   WORD       biPlanes; //必填 1

   WORD       biBitCount; //必填 1482432之一,該值很重要!

   DWORD      biCompression;//必填BI_RGB,BI_RGB8,BI_RLE4之一,一般是BI_RGB

   DWORD      biSizeImage; //可選填,值爲象素信息的字節總數

   LONG       biXPelsPerMeter;//可選填,一般爲C4 0E 00 00,也可填0

   LONG       biYPelsPerMeter; //可選填,同上

   DWORD      biClrUsed; //必填,一般爲0,

   DWORD      biClrImportant;//必填,一般爲0

} BITMAPINFOHEADER                           

 

       不同的部分:象素值

根據biBitCount參數有以下3種情況

<!--[if !supportLists]-->(1)   <!--[endif]-->有調色板(biBitCount參數值爲1、4、8)

此時位圖文件先跟一段調色板顏色數據,再跟象素的顏色索引信息數據;

<!--[if !supportLists]-->(2)   <!--[endif]-->無調色板(biBitCount參數值爲24)

此時直接跟一段象素數據,每個象素由3個字節表示顏色值,順序BGR;

<!--[if !supportLists]-->(3)   <!--[endif]-->無調色板(biBitCount參數值爲32)

此時直接跟一段象素數據,每個象素由4個字節表示顏色值,順序BGR;

 

 

例1;1位象素單色4×4位圖,假設第1、3象素爲黑色,其他都爲白色,那麼有下面的數據來表示該位圖的象素顏色值

00 00 00 00 FF FF FF 00; 50 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00 00.

說明:前面8個字節,是調色板的值,單色只有黑色和白色兩種,它們的RGB表示就是前面的8個字節。RGB(0,0,0)爲黑色,RGB(255,255,255)爲白色,

50 00 00 00表示第一行位圖象素,這裏只有前4位有效,其他位都是補位而已。5的二進制就是0101,它對應第一行的四個象素的顏色索引“黑白黑白”;

F0 00 00 00表示第二行的位圖象素,這裏也是前4位有效,F的二進制是1111,正好對應顏色索引“白白白白”;

其他行的象素顏色一樣表示法。

 

注:這裏單色,所以參數biBitCount爲1,即1位表示一個象素,所以4×4的每行就只有4位來表示象素顏色就夠了,但是,系統規定必須32位對齊,所以需要28位0來來補足。故這裏的每行都用4個字節來表示,只是後面28位沒有實際用處而已。

 

注意:每個調色板中的一種顏色,必須用4個字節表示(RGB絕對值)

注意:關於象素每行補位算法,到底要補多少位,這可以不用操心,用算法

int i = ((Bitmap.bmWidth *wBitCount+31)/32)*4*Bitmap.bmHeight  得到的i就是: 描述位圖象素顏色總的要用到的字節數。該字節數減去該行象素的字節數,就是補位的字節數。

 

調色板的顏色個數爲2的biBitCount次冪,

 

例2:4位象素8色的4×4位圖,假設第一行第一象素爲綠色,第三象素爲紅色,第二象素爲藍色,底爲黑色,則有下面的數據來表示該位圖文件的顏色值

RGBQUAD  pallete[16] = { (0x0, 0x0, 0x0, 0x0), (0xFF, 0xFF, 0xFF, 0x0), (0xFF,0x0,0x0,0x0), (0x0,0xFF,0x0,0x0),( 0x0,0x0,0xFF,0x0),( 0xFF,0xFF,0x0,0x0),( 0xFF,0x0,0xFF,0x0),

(0x0,0xFF,0xFF,0x0),( 0xFF,0x80,0x0,0x0),( 0xFF,0x0,0x80,0x0),( 0xFF,0x80,0x80,0x0),

(0xFF,0xFF,0x80,0x0),( 0x80,0x80,0x80,0x0),( 0x80,0x0,0x0,0x0),( 0x,0x80,0x0,0x0),

(0x0,0x0,0x80,0x0)};

這是調色板顏色值,後面要跟各個象素的顏色索引值,它們共同組成象素顏色值的表述

32 40 00 00  00 00 00 00  00 00 00 00  00 00 00 00

第一行“32 40 00 00”分別表示“綠藍紅黑”後16位爲補位;

其他行一樣的理解。

 

例3:24位象素彩色的4×4位圖,假設第一行第一象素爲綠色,第三象素爲紅色,第二象素爲藍色,底爲白色,則有下面的數據來表示該位圖文件的顏色值

00 FF 00  FF 00 00  00 00 FF  FF FF FF  00(標誌換行)

FF FF FF  FF FF FF  FF FF FF  FF FF FF  00

FF FF FF  FF FF FF  FF FF FF  FF FF FF  00

FF FF FF  FF FF FF  FF FF FF  FF FF FF  00

 

注意:24位象素的位圖文件沒有調色板,但是,它的每個象素也不是用4字節表示,而是用3字節表示,即沒有那個顏色結構的保留字節。但是,這樣就會出現每行字節不能16位對齊的問題,所以每行完了必須要有個行結束字節“00”,

 

例4:32位象素真彩色的4×4位圖,假設第一行第一象素爲綠色,第三象素爲紅色,第二象素爲藍色,底爲白色,則有下面的數據來表示該位圖文件的顏色值

00 FF 00 00  FF 00 00 00  00 00 FF 00  FF FF FF 00

FF FF FF 00  FF FF FF 00  FF FF FF 00  FF FF FF 00

FF FF FF 00  FF FF FF 00  FF FF FF 00  FF FF FF 00

FF FF FF 00  FF FF FF 00  FF FF FF 00  FF FF FF 00

 

32位象素的位圖,也沒有調色板,但是它的顏色值是用4字節來表示的,除了RGB值外,還有一個保留值,始終爲0。

 

 

這裏的例子沒有列舉8位象素64色的位圖,它的文件組織格式參看4位象素16色的例子。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章