隨筆-57  評論-202  文章-17  trackbacks-0
          6.1 BMP文件格式

          6.1.1 簡介

          位圖文件(Bitmap-File,BMP)格式是Windows采用的圖像文件存儲格式,在Windows環(huán)境下運行的所有圖像處理軟件都支持這種格式。Windows 3.0以前的BMP位圖文件格式與顯示設(shè)備有關(guān),因此把它稱為設(shè)備相關(guān)位圖(device-dependent bitmap,DDB)文件格式。Windows 3.0以后的BMP位圖文件格式與顯示設(shè)備無關(guān),因此把這種BMP位圖文件格式稱為設(shè)備無關(guān)位圖(device-independent bitmap,DIB)格式,目的是為了讓W(xué)indows能夠在任何類型的顯示設(shè)備上顯示BMP位圖文件。BMP位圖文件默認的文件擴展名是BMP或者bmp。

          6.1.2 文件結(jié)構(gòu)

          位圖文件可看成由4個部分組成:位圖文件頭(bitmap-file header)、位圖信息頭(bitmap-information header)、彩色表(color table)和定義位圖的字節(jié)陣列,它們的名稱和符號如表6-01所示。

          表6-01 BMP圖像文件組成部分的名稱和符號

          位圖文件的組成

          結(jié)構(gòu)名稱

          符號

          位圖文件頭(bitmap-file header)

          BITMAPFILEHEADER

          bmfh

          位圖信息頭(bitmap-information header)

          BITMAPINFOHEADER

          bmih

          彩色表(color table)

          RGBQUAD

          aColors[]

          圖像數(shù)據(jù)陣列字節(jié)

          BYTE

          aBitmapBits[]

          位圖文件結(jié)構(gòu)可綜合在表6-02中。

          表6-02 位圖文件結(jié)構(gòu)內(nèi)容摘要

           

          偏移量

          域的名稱

          大小

          內(nèi)容

           

           

           

          圖像文件

          0000h

          標(biāo)識符(Identifier)

          2 bytes

          兩字節(jié)的內(nèi)容用來識別位圖的類型:

          BM : Windows 3.1x, 95, NT,

          BA :OS/2 Bitmap Array

          CI :OS/2 Color Icon

          CP :OS/2 Color Pointer

          IC : OS/2 Icon

          PT :OS/2 Pointer

           

          0002h

          File Size

          1 dword

          用字節(jié)表示的整個文件的大小

           

          0006h

          Reserved

          1 dword

          保留,設(shè)置為0

           

          000Ah

          Bitmap Data Offset

          1 dword

          從文件開始到位圖數(shù)據(jù)開始之間的數(shù)據(jù)(bitmap data)之間的偏移量

           

          000Eh

          Bitmap Header Size

          1 dword

          位圖信息頭(Bitmap Info Header)的長度,用來描述位圖的顏色、壓縮方法等。下面的長度表示:

          28h - Windows 3.1x, 95, NT,

          0Ch - OS/2 1.x

          F0h - OS/2 2.x

           

          0012h

          Width

          1 dword

          位圖的寬度,以像素為單位

           

          0016h

          Height

          1 dword

          位圖的高度,以像素為單位

           

          001Ah

          Planes

          1 word

          位圖的位面數(shù)


          圖像

          信息

           

           

          001Ch

          Bits Per Pixel

          1 word

          每個像素的位數(shù)

          1 - Monochrome bitmap

          4 - 16 color bitmap

          8 - 256 color bitmap

          16 - 16bit (high color) bitmap

          24 - 24bit (true color) bitmap

          32 - 32bit (true color) bitmap

           

          001Eh

          Compression

          1 dword

          壓縮說明:

          0 - none (也使用BI_RGB表示)

          1 - RLE 8-bit / pixel (也使用BI_RLE4表示)

          2 - RLE 4-bit / pixel (也使用BI_RLE8表示)

          3 - Bitfields (也使用BI_BITFIELDS表示)

           

          0022h

          Bitmap Data Size

          1 dword

          用字節(jié)數(shù)表示的位圖數(shù)據(jù)的大小。該數(shù)必須是4的倍數(shù)

           

          0026h

          HResolution

          1 dword

          用像素/米表示的水平分辨率

           

          002Ah

          VResolution

          1 dword

          用像素/米表示的垂直分辨率

           

          002Eh

          Colors

          1 dword

          位圖使用的顏色數(shù)。如8-位/像素表示為100h或者 256.

           

          0032h

          Important Colors

          1 dword

          指定重要的顏色數(shù)。當(dāng)該域的值等于顏色數(shù)時,表示所有顏色都一樣重要

          調(diào)色板數(shù)據(jù)

          0036h

          Palette

          N * 4 byte

          調(diào)色板規(guī)范。對于調(diào)色板中的每個表項,這4個字節(jié)用下述方法來描述RGB的值:

          • 1字節(jié)用于藍色分量
          • 1字節(jié)用于綠色分量
          • 1字節(jié)用于紅色分量
          • 1字節(jié)用于填充符(設(shè)置為0)

          圖像數(shù)據(jù)

          0436h

          Bitmap Data

          x bytes

          該域的大小取決于壓縮方法,它包含所有的位圖數(shù)據(jù)字節(jié),這些數(shù)據(jù)實際就是彩色調(diào)色板的索引號

           

          6.1.3 構(gòu)件詳解

          1. 位圖文件頭

          位圖文件頭包含有關(guān)于文件類型、文件大小、存放位置等信息,在Windows 3.0以上版本的位圖文件中用BITMAPFILEHEADER結(jié)構(gòu)來定義:

          typedef struct tagBITMAPFILEHEADER { /* bmfh */

          UINT bfType;

          DWORD bfSize;

          UINT bfReserved1;

          UINT bfReserved2;

          DWORD bfOffBits;

          } BITMAPFILEHEADER;

          其中:

          bfType

          說明文件的類型.

          bfSize

          說明文件的大小,用字節(jié)為單位

          bfReserved1

          保留,設(shè)置為0

          bfReserved2

          保留,設(shè)置為0

          bfOffBits

          說明從BITMAPFILEHEADER結(jié)構(gòu)開始到實際的圖像數(shù)據(jù)之間的字 節(jié)偏移量

           

          2. 位圖信息頭

          位圖信息用BITMAPINFO結(jié)構(gòu)來定義,它由位圖信息頭(bitmap-information header)和彩色表(color table)組成,前者用BITMAPINFOHEADER結(jié)構(gòu)定義,后者用RGBQUAD結(jié)構(gòu)定義。BITMAPINFO結(jié)構(gòu)具有如下形式:

          typedef struct tagBITMAPINFO { /* bmi */

          BITMAPINFOHEADER bmiHeader;

          RGBQUAD bmiColors[1];

          } BITMAPINFO;

          其中:

          bmiHeader

          說明BITMAPINFOHEADER結(jié)構(gòu)

          bmiColors

          說明彩色表RGBQUAD結(jié)構(gòu)的陣列

          BITMAPINFOHEADER結(jié)構(gòu)包含有位圖文件的大小、壓縮類型和顏色格式,其結(jié)構(gòu)定義為:

          typedef struct tagBITMAPINFOHEADER { /* bmih */

          DWORD biSize;

          LONG biWidth;

          LONG biHeight;

          WORD biPlanes;

          WORD biBitCount;

          DWORD biCompression;

          DWORD biSizeImage;

          LONG biXPelsPerMeter;

          LONG biYPelsPerMeter;

          DWORD biClrUsed;

          DWORD biClrImportant;

          } BITMAPINFOHEADER;

          其中:

          biSize

          說明BITMAPINFOHEADER結(jié)構(gòu)所需要的字節(jié)數(shù)

          biWidth

          說明圖像的寬度,以像素為單位

          biHeight

          說明圖像的高度,以像素為單位

          biPlanes

          為目標(biāo)設(shè)備說明位面數(shù),其值設(shè)置為1

          biBitCount

          說明位數(shù)/像素,其值為1、2、4或者24

          biCompression

          • 說明圖像數(shù)據(jù)壓縮的類型。其值可以是下述值之一:
            BI_RGB:沒有壓縮;
          • BI_RLE8:每個像素8位的RLE壓縮編碼,壓縮格式由2字節(jié)組成(重復(fù)像素計數(shù)和顏色索引);
          • BI_RLE4:每個像素4位的RLE壓縮編碼,壓縮格式由2字節(jié)組成

          biSizeImage

          說明圖像的大小,以字節(jié)為單位。當(dāng)用BI_RGB格式時,可設(shè)置為0

          biXPelsPerMeter

          說明水平分辨率,用像素/米表示

          biYPelsPerMeter

          說明垂直分辨率,用像素/米表示

          biClrUsed

          說明位圖實際使用的彩色表中的顏色索引數(shù)

          biClrImportant

          說明對圖像顯示有重要影響的顏色索引的數(shù)目,如果是0,表示都重要。

          現(xiàn)就BITMAPINFOHEADER結(jié)構(gòu)作如下說明:

          (1) 彩色表的定位

          應(yīng)用程序可使用存儲在biSize成員中的信息來查找在BITMAPINFO結(jié)構(gòu)中的彩色表,如下所示:

          pColor = ((LPSTR) pBitmapInfo + (WORD) (pBitmapInfo->bmiHeader.biSize))

          (2) biBitCount

          biBitCount=1 表示位圖最多有兩種顏色,黑色和白色。圖像數(shù)據(jù)陣列中的每一位表示一個像素。

          biBitCount=4 表示位圖最多有16種顏色。每個像素用4位表示,并用這4位作為彩色表的表項來查找該像素的顏色。例如,如果位圖中的第一個字節(jié)為0x1F,它表示有兩個像素,第一像素的顏色就在彩色表的第2表項中查找,而第二個像素的顏色就在彩色表的第16表項中查找。

          biBitCount=8 表示位圖最多有256種顏色。每個像素用8位表示,并用這8位作為彩色表的表項來查找該像素的顏色。例如,如果位圖中的第一個字節(jié)為0x1F,這個像素的顏色就在彩色表的第32表項中查找。

          biBitCount=24 表示位圖最多有224=16 777 216種顏色。bmiColors (或者bmciColors)成員就為NULL。每3個字節(jié)代表一個像素,其顏色有R、G、B字節(jié)的相對強度決定。

          (3) ClrUsed

          BITMAPINFOHEADER結(jié)構(gòu)中的成員ClrUsed指定實際使用的顏色數(shù)目。如果ClrUsed設(shè)置成0,位圖使用的顏色數(shù)目就等于biBitCount成員中的數(shù)目。

          (4) 圖像數(shù)據(jù)壓縮

          ① BI_RLE8:每個像素為8位的RLE壓縮編碼,可使用編碼方式和絕對方式中的任何一種進行壓縮,這兩種方式可在同一幅圖中的任何地方使用。

          編碼方式:由2個字節(jié)組成,第一個字節(jié)指定使用相同顏色的像素數(shù)目,第二個字節(jié)指定使用的顏色索引。此外,這個字節(jié)對中的第一個字節(jié)可設(shè)置為0,聯(lián)合使用第二個字節(jié)的值表示:

          • 第二個字節(jié)的值為0:行的結(jié)束。
          • 第二個字節(jié)的值為1:圖像結(jié)束。
          • 第二個字節(jié)的值為2:其后的兩個字節(jié)表示下一個像素從當(dāng)前開始的水平和垂直位置的偏移量。

          絕對方式:第一個字節(jié)設(shè)置為0,而第二個字節(jié)設(shè)置為0x03~0xFF之間的一個值。在這種方式中,第二個字節(jié)表示跟在這個字節(jié)后面的字節(jié)數(shù),每個字節(jié)包含單個像素的顏色索引。壓縮數(shù)據(jù)格式需要字邊界(word boundary)對齊。

          [例6.1] 用十六進制表示的8位壓縮圖像數(shù)據(jù)如下:

          03 04 05 06 00 03 45 56 67 00 02 78 00 02 05 01 02 78 00 00 09 1E 00 01
          這些壓縮數(shù)據(jù)可解釋為 :

          壓縮數(shù)據(jù)

          擴展數(shù)據(jù)

          03 04

          04 04 04

          05 06

          06 06 06 06 06

          00 03 45 56 67 00

          45 56 67

          02 78

          78 78

          00 02 05 01

          從當(dāng)前位置右移5個位置后向下移一行

          02 78

          78 78

          00 00

          行結(jié)束

          09 1E

          1E 1E 1E 1E 1E 1E 1E 1E 1E

          00 01

          RLE編碼圖像結(jié)束

          ② BI_RLE4:每個像素為4位的RLE壓縮編碼,同樣也可使用編碼方式和絕對方式中的任何一種進行壓縮,這兩種方式也可在同一幅圖中的任何地方使用。這兩種方式是:

          編碼方式:由2個字節(jié)組成,第一個字節(jié)指定像素數(shù)目,第二個字節(jié)包含兩種顏色索引,一個在高4位,另一個在低4位。第一個像素使用高4位的顏色索引,第二個使用低4位的顏色索引,第3個使用高4位的顏色索引,依此類推。

          絕對方式:這個字節(jié)對中的第一個字節(jié)設(shè)置為0,第二個字節(jié)包含有顏色索引數(shù),其后續(xù)字節(jié)包含有顏色索引,顏色索引存放在該字節(jié)的高、低4位中,一個顏色索引對應(yīng)一個像素。此外,BI_RLE4也同樣聯(lián)合使用第二個字節(jié)中的值表示:

          • 第二個字節(jié)的值為0:行的結(jié)束。
          • 第二個字節(jié)的值為1:圖像結(jié)束。
          • 第二個字節(jié)的值為2:其后的兩個字節(jié)表示下一個像素從當(dāng)前開始的水平和垂直位置的偏移量。

          [例6.2] 用十六進制數(shù)表示的4位壓縮圖像數(shù)據(jù):

          03 04 05 06 00 06 45 56 67 00 04 78 00 02 05 01 04 78 00 00 09 1E 00 01

          這些壓縮數(shù)據(jù)可解釋為 :

          壓縮數(shù)據(jù)

          擴展數(shù)據(jù)

          03 04

          0 4 0

          05 06

          0 6 0 6 0

          00 06 45 56 67 00

          4 5 5 6 6 7

          04 78

          7 8 7 8

          00 02 05 01

          從當(dāng)前位置右移5個位置后向下移一行

          04 78

          7 8 7 8

          00 00

          行結(jié)束

          09 1E

          1 E 1 E 1 E 1 E 1

          00 01

          RLE圖像結(jié)束

           

          3. 彩色表

          彩色表包含的元素與位圖所具有的顏色數(shù)相同,像素的顏色用RGBQUAD結(jié)構(gòu)來定義。對于24-位真彩色圖像就不使用彩色表,因為位圖中的RGB值就代表了每個像素的顏色。彩色表中的顏色按顏色的重要性排序,這可以輔助顯示驅(qū)動程序為不能顯示足夠多顏色數(shù)的顯示設(shè)備顯示彩色圖像。RGBQUAD結(jié)構(gòu)描述由R、G、B相對強度組成的顏色,定義如下:

          typedef struct tagRGBQUAD { /* rgbq */

          BYTE rgbBlue;

          BYTE rgbGreen;

          BYTE rgbRed;

          BYTE rgbReserved;

          } RGBQUAD;

          其中:

          rgbBlue

          指定藍色強度

          rgbGreen

          指定綠色強度

          rgbRed

          指定紅色強度

          rgbReserved

          保留,設(shè)置為0

           

          4. 位圖數(shù)據(jù)

          緊跟在彩色表之后的是圖像數(shù)據(jù)字節(jié)陣列。圖像的每一掃描行由表示圖像像素的連續(xù)的字節(jié)組成,每一行的字節(jié)數(shù)取決于圖像的顏色數(shù)目和用像素表示的圖像寬度。掃描行是由底向上存儲的,這就是說,陣列中的第一個字節(jié)表示位圖左下角的像素,而最后一個字節(jié)表示位圖右上角的像素。

          posted on 2005-06-22 16:50 小米 閱讀(26792) 評論(9)  編輯  收藏 所屬分類: 其它

          評論:
          # re: BMP文件格式 2006-07-06 17:07 | yanglei
          askjsd
            回復(fù)  更多評論
            
          # re: BMP文件格式 2006-07-19 14:02 | 1
          # re: BMP文件格式 2007-11-07 16:55 | 中華信鴿
          又學(xué)到一點:)  回復(fù)  更多評論
            
          # re: BMP文件格式 2007-12-19 19:22 | guest
          你的博客真的很好  回復(fù)  更多評論
            
          # thsgjnnc 2008-02-06 00:58 | thsgjnnc
          karqfbav http://clnwqqbi.com mqqpexnq aisnmmtj  回復(fù)  更多評論
            
          # re: BMP文件格式 2008-03-01 18:17 | 隨心high
          # re: BMP文件格式 2008-07-21 10:11 | spiet
          thank u very much  回復(fù)  更多評論
            
          # re: BMP文件格式 2008-11-04 11:07 | asf
          very very good  回復(fù)  更多評論
            
          # re: BMP文件格式 2013-11-09 14:05 | 見面
          luchuan1985:(19:39:24)
          您是要什么呢
          aisaiweier:(19:39:46)
          測試紙犬瘟疫苗
          luchuan1985:(19:40:51)
          滿百包郵的親
          aisaiweier:(19:43:30)
          貨到付款多少包郵,有沒有買一包郵品包首重的,手續(xù)費多少,山東鄄城,幾天到
          aisaiweier:(19:43:34)

          aisaiweier:(19:44:05)

          luchuan1985:(19:44:53)
          貨到付款不包郵,手續(xù)費5元,3天左右到
          aisaiweier:(19:45:54)
          有沒有買一包郵品包首重的
          luchuan1985:(19:47:24)
          貨到付款不包郵的,是包郵的商品也不包
          aisaiweier:(20:32:26)
          測試紙犬瘟疫苗有嗎
          luchuan1985:(20:32:41)
          試紙有
          aisaiweier:(21:29:18)
          店鋪名
          luchuan1985:(21:29:40)
          愛寵舍
          aisaiweier:(21:29:47)
          我買測試紙
          aisaiweier:(21:30:04)
          1天能到不
          luchuan1985:(21:30:39)
          周一發(fā)貨
          aisaiweier:(21:32:58)
          我今天提交訂單,快遞10元,最快的快遞
          luchuan1985:(21:33:34)
          周一發(fā)貨哦親
          aisaiweier:(21:34:17)
          明天行不
          aisaiweier:(21:34:29)
          中午
          luchuan1985:(21:34:31)
          庫房休息哦
          aisaiweier:(21:34:42)
          急用
          aisaiweier:(21:34:58)
          手續(xù)費10元
          luchuan1985:(21:35:25)
          庫房沒人,只能周一發(fā)
          aisaiweier:(21:36:12)
          你呢
          luchuan1985:(21:36:39)
          我是客服,進不了庫房
          aisaiweier:(21:42:11)
          什么時候到
          aisaiweier:(21:42:39)

          luchuan1985:(21:42:45)
          貨到付款?
          aisaiweier:(21:42:54)

          aisaiweier:(21:44:10)
          怎么了
          luchuan1985:(21:44:25)
          發(fā)哪里
          aisaiweier:(21:45:10)
          山東
          luchuan1985:(21:45:31)
          三天左右
          aisaiweier:(23:30:06)
          我提交了
          aisaiweier:(23:30:25)
          100元貨到付款包郵嗎
          luchuan1985:(23:31:25)
          只要是貨到付款都不包郵的親
          aisaiweier:(23:32:18)
          我提交了什么時候到貨
          luchuan1985:(23:32:41)
          周一發(fā)貨,三天左右
          aisaiweier:(23:33:09)
          最快星期幾
          aisaiweier:(23:33:38)
          請盡快安排發(fā)貨,急用
          aisaiweier:(23:33:58)

          aisaiweier:(23:35:01)

          aisaiweier:(23:35:05)
            回復(fù)  更多評論
            
          主站蜘蛛池模板: 彭阳县| 蛟河市| 贵溪市| 兴海县| 西贡区| 博爱县| 平阳县| 平塘县| 平阴县| 喀什市| 靖宇县| 海丰县| 民乐县| 抚宁县| 雅安市| 庆城县| 会泽县| 阳原县| 呼玛县| 新竹市| 富蕴县| 延川县| 太湖县| 栾城县| 普定县| 洞头县| 天峻县| 兴国县| 商都县| 栾城县| 天等县| 海阳市| 鲜城| 德格县| 忻州市| 陆良县| 荥经县| 宣城市| 淮北市| 登封市| 毕节市|