日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

BMP文件格式

 藥林怪人.櫻凡 2006-03-08

 BMP文件格式

6.1.1 簡(jiǎn)介

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

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

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

表6-01 BMP圖像文件組成部分的名稱和符號(hào)

位圖文件的組成

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

符號(hào)

位圖文件頭(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)識(shí)符(Identifier)

2 bytes

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

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é)表示的整個(gè)文件的大小

 

0006h

Reserved

1 dword

保留,設(shè)置為0

 

000Ah

Bitmap Data Offset

1 dword

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

 

000Eh

Bitmap Header Size

1 dword

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

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

每個(gè)像素的位數(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

壓縮說(shuō)明:

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ù)時(shí),表示所有顏色都一樣重要

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

0036h

Palette

N * 4 byte

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

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

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

0436h

Bitmap Data

x bytes

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

 

 

6.1.3 構(gòu)件詳解

1. 位圖文件頭

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

typedef struct tagBITMAPFILEHEADER { /* bmfh */

UINT bfType;

DWORD bfSize;

UINT bfReserved1;

UINT bfReserved2;

DWORD bfOffBits;

} BITMAPFILEHEADER;

其中:

bfType

說(shuō)明文件的類型.

bfSize

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

bfReserved1

保留,設(shè)置為0

bfReserved2

保留,設(shè)置為0

bfOffBits

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

 

2. 位圖信息頭

位圖信息用BITMAPINFO結(jié)構(gòu)來(lái)定義,它由位圖信息頭(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

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

bmiColors

說(shuō)明彩色表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

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

biWidth

說(shuō)明圖像的寬度,以像素為單位

biHeight

說(shuō)明圖像的高度,以像素為單位

biPlanes

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

biBitCount

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

biCompression

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

biSizeImage

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

biXPelsPerMeter

說(shuō)明水平分辨率,用像素/米表示

biYPelsPerMeter

說(shuō)明垂直分辨率,用像素/米表示

biClrUsed

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

biClrImportant

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

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

(1) 彩色表的定位

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

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

(2) biBitCount

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

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

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

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

(3) ClrUsed

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

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

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

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

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

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

[例6.1] 用十六進(jìn)制表示的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ù)

擴(kuò)展數(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個(gè)位置后向下移一行

02 78

78 78

00 00

行結(jié)束

09 1E

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

00 01

RLE編碼圖像結(jié)束

 

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

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

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

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

[例6.2] 用十六進(jìn)制數(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ù)

擴(kuò)展數(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個(gè)位置后向下移一行

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)來(lái)定義。對(duì)于24-位真彩色圖像就不使用彩色表,因?yàn)槲粓D中的RGB值就代表了每個(gè)像素的顏色。彩色表中的顏色按顏色的重要性排序,這可以輔助顯示驅(qū)動(dòng)程序?yàn)椴荒茱@示足夠多顏色數(shù)的顯示設(shè)備顯示彩色圖像。RGBQUAD結(jié)構(gòu)描述由R、G、B相對(duì)強(qiáng)度組成的顏色,定義如下:

typedef struct tagRGBQUAD { /* rgbq */

BYTE rgbBlue;

BYTE rgbGreen;

BYTE rgbRed;

BYTE rgbReserved;

} RGBQUAD;

其中:

rgbBlue

指定藍(lán)色強(qiáng)度

rgbGreen

指定綠色強(qiáng)度

rgbRed

指定紅色強(qiáng)度

rgbReserved

保留,設(shè)置為0

 

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

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





    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多