青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

c++初學者

專注技術開發

(轉) bmp圖文件結構

位圖文件可看成由4個部分組成:位圖文件頭(bitmap-file header)、位圖信息頭(bitmap-information header)、彩色表(color table)和定義位圖的字節陣列,它具有如下所示的形式。

位圖文件的組成

結構名稱

符號

位圖文件頭(bitmap-file header) BITMAPFILEHEADER bmfh
位圖信息頭(bitmap-information header) BITMAPINFOHEADER bmih
彩色表(color table) RGBQUAD aColors[]
圖象數據陣列字節 BYTE aBitmapBits[]

位圖文件結構可綜合在表6-01中。

表01 位圖文件結構內容摘要

 

偏移量

域的名稱

大小

內容

 

 

 

圖象文件

0000h 文件標識 2 bytes 兩字節的內容用來識別位圖的類型:

‘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

注:因為OS/2系統并沒有被普及開,所以在編程時,你只需判斷第一個標識“BM”就行。

  0002h File Size 1 dword 用字節表示的整個文件的大小
  0006h Reserved 1 dword 保留,必須設置為0
  000Ah Bitmap Data Offset 1 dword 從文件開始到位圖數據開始之間的數據(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

注:在Windows95、98、2000等操作系統中,位圖信息頭的長度并不一定是28h,因為微軟已經制定出了新的BMP文件格式,其中的信息頭結構變化比較大,長度加長。所以最好不要直接使用常數28h,而是應該從具體的文件中讀取這個值。這樣才能確保程序的兼容性。

  0012h Width 1 dword 位圖的寬度,以象素為單位
  0016h Height 1 dword 位圖的高度,以象素為單位
  001Ah Planes 1 word 位圖的位面數(注:該值將總是1)

圖象

信息

 

 

001Ch Bits Per Pixel 1 word 每個象素的位數

1 - 單色位圖(實際上可有兩種顏色,缺省情況下是黑色和白色。你可以自己定義這兩種顏色)

4 - 16 色位圖

8 - 256 色位圖

16 - 16bit 高彩色位圖

24 - 24bit 真彩色位圖

32 - 32bit 增強型真彩色位圖

  001Eh Compression 1 dword 壓縮說明:

0 - 不壓縮 (使用BI_RGB表示)

1 - RLE 8-使用8位RLE壓縮方式(用BI_RLE8表示)

2 - RLE 4-使用4位RLE壓縮方式(用BI_RLE4表示)

3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)

  0022h Bitmap Data Size 1 dword 用字節數表示的位圖數據的大小。該數必須是4的倍數
  0026h HResolution 1 dword 用象素/米表示的水平分辨率
  002Ah VResolution 1 dword 用象素/米表示的垂直分辨率
  002Eh Colors 1 dword 位圖使用的顏色數。如8-比特/象素表示為100h或者 256.
  0032h Important Colors 1 dword 指定重要的顏色數。當該域的值等于顏色數時(或者等于0時),表示所有顏色都一樣重要
調色板數據 根據BMP版本的不同而不同 Palette N * 4 byte 調色板規范。對于調色板中的每個表項,這4個字節用下述方法來描述RGB的值:
1字節用于藍色分量
1字節用于綠色分量
1字節用于紅色分量
1字節用于填充符(設置為0)
圖象數據 根據BMP版本及調色板尺寸的不同而不同 Bitmap Data xxx bytes 該域的大小取決于壓縮方法及圖像的尺寸和圖像的位深度,它包含所有的位圖數據字節,這些數據可能是彩色調色板的索引號,也可能是實際的RGB值,這將根據圖像信息頭中的位深度值來決定。

構件詳解

1. 位圖文件頭

位圖文件頭包含有關于文件類型、文件大小、存放位置等信息,在Windows 3.0以上版本的位圖文件中用BITMAPFILEHEADER結構來定義:

typedef struct tagBITMAPFILEHEADER { /* bmfh */

UINT bfType;
DWORD bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits;

} BITMAPFILEHEADER;

 

其中:

bfType

說明文件的類型.(該值必需是0x4D42,也就是字符’BM’。我們不需要判斷OS/2的位圖標識,這么做現在來看似乎已經沒有什么意義了,而且如果要支持OS/2的位圖,程序將變得很繁瑣。所以,在此只建議你檢察’BM’標識)

bfSize

說明文件的大小,用字節為單位

bfReserved1

保留,必須設置為0

bfReserved2

保留,必須設置為0

bfOffBits

說明從文件頭開始到實際的圖象數據之間的字節的偏移量。這個參數是非常有用的,因為位圖信息頭和調色板的長度會根據不同情況而變化,所以你可以用這個偏移值迅速的從文件中讀取到位數據。

2. 位圖信息頭

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

typedef struct tagBITMAPINFO { /* bmi */

BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];

} BITMAPINFO;

 

其中:

bmiHeader

說明BITMAPINFOHEADER結構,其中包含了有關位圖的尺寸及位格式等信息

bmiColors

說明彩色表RGBQUAD結構的陣列,其中包含索引圖像的真實RGB值。

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

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結構所需要的字數。注:這個值并不一定是BITMAPINFOHEADER結構的尺寸,它也可能是sizeof(BITMAPV4HEADER)的值,或是sizeof(BITMAPV5HEADER)的值。這要根據該位圖文件的格式版本來決定,不過,就現在的情況來看,絕大多數的BMP圖像都是BITMAPINFOHEADER結構的(可能是后兩者太新的緣故吧:-)。

biWidth

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

biHeight

說明圖象的高度,以象素為單位。注:這個值除了用于描述圖像的高度之外,它還有另一個用處,就是指明該圖像是倒向的位圖,還是正向的位圖。如果該值是一個正數,說明圖像是倒向的,如果該值是一個負數,則說明圖像是正向的。大多數的BMP文件都是倒向的位圖,也就是時,高度值是一個正數。(注:當高度值是一個負數時(正向圖像),圖像將不能被壓縮(也就是說biCompression成員將不能是BI_RLE8或BI_RLE4)。

biPlanes

為目標設備說明位面數,其值將總是被設為1

biBitCount

說明比特數/象素,其值為1、4、8、16、24、或32

biCompression

說明圖象數據壓縮的類型。其值可以是下述值之一:
BI_RGB:沒有壓縮;
BI_RLE8:每個象素8比特的RLE壓縮編碼,壓縮格式由2字節組成(重復象素計數和顏色索引);
BI_RLE4:每個象素4比特的RLE壓縮編碼,壓縮格式由2字節組成
BI_BITFIELDS:每個象素的比特由指定的掩碼決定。

biSizeImage

說明圖象的大小,以字節為單位。當用BI_RGB格式時,可設置為0

biXPelsPerMeter

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

biYPelsPerMeter

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

biClrUsed

說明位圖實際使用的彩色表中的顏色索引數(設為0的話,則說明使用所有調色板項)

biClrImportant

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

現就BITMAPINFOHEADER結構作如下說明:

(1) 彩色表的定位

應用程序可使用存儲在biSize成員中的信息來查找在BITMAPINFO結構中的彩色表,如下所示:

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

(2) biBitCount

biBitCount=1 表示位圖最多有兩種顏色,缺省情況下是黑色和白色,你也可以自己定義這兩種顏色。圖像信息頭裝調色板中將有兩個調色板項,稱為索引0和索引1。圖象數據陣列中的每一位表示一個象素。如果一個位是0,顯示時就使用索引0的RGB值,如果位是1,則使用索引1的RGB值。

biBitCount=4 表示位圖最多有16種顏色。每個象素用4位表示,并用這4位作為彩色表的表項來查找該象素的顏色。例如,如果位圖中的第一個字節為0x1F,它表示有兩個象素,第一象素的顏色就在彩色表的第2表項中查找,而第二個象素的顏色就在彩色表的第16表項中查找。此時,調色板中缺省情況下會有16個RGB項。對應于索引0到索引15。

biBitCount=8 表示位圖最多有256種顏色。每個象素用8位表示,并用這8位作為彩色表的表項來查找該象素的顏色。例如,如果位圖中的第一個字節為0x1F,這個象素的顏色就在彩色表的第32表項中查找。此時,缺省情況下,調色板中會有256個RGB項,對應于索引0到索引255。

biBitCount=16 表示位圖最多有216種顏色。每個色素用16位(2個字節)表示。這種格式叫作高彩色,或叫增強型16位色,或64K色。它的情況比較復雜,當biCompression成員的值是BI_RGB時,它沒有調色板。16位中,最低的5位表示藍色分量,中間的5位表示綠色分量,高的5位表示紅色分量,一共占用了15位,最高的一位保留,設為0。這種格式也被稱作555 16位位圖。如果biCompression成員的值是BI_BITFIELDS,那么情況就復雜了,首先是原來調色板的位置被三個DWORD變量占據,稱為紅、綠、藍掩碼。分別用于描述紅、綠、藍分量在16位中所占的位置。在Windows 95(或98)中,系統可接受兩種格式的位域:555和565,在555格式下,紅、綠、藍的掩碼分別是:0x7C00、0x03E0、0x001F,而在565格式下,它們則分別為:0xF800、0x07E0、0x001F。你在讀取一個像素之后,可以分別用掩碼“與”上像素值,從而提取出想要的顏色分量(當然還要再經過適當的左右移操作)。在NT系統中,則沒有格式限制,只不過要求掩碼之間不能有重疊。(注:這種格式的圖像使用起來是比較麻煩的,不過因為它的顯示效果接近于真彩,而圖像數據又比真彩圖像小的多,所以,它更多的被用于游戲軟件)。

biBitCount=24 表示位圖最多有224種顏色。這種位圖沒有調色板(bmiColors成員尺寸為0),在位數組中,每3個字節代表一個象素,分別對應于顏色R、G、B。

biBitCount=32 表示位圖最多有232種顏色。這種位圖的結構與16位位圖結構非常類似,當biCompression成員的值是BI_RGB時,它也沒有調色板,32位中有24位用于存放RGB值,順序是:最高位—保留,紅8位、綠8位、藍8位。這種格式也被成為888 32位圖。如果 biCompression成員的值是BI_BITFIELDS時,原來調色板的位置將被三個DWORD變量占據,成為紅、綠、藍掩碼,分別用于描述紅、綠、藍分量在32位中所占的位置。在Windows 95(or 98)中,系統只接受888格式,也就是說三個掩碼的值將只能是:0xFF0000、0xFF00、0xFF。而在NT系統中,你只要注意使掩碼之間不產生重疊就行。(注:這種圖像格式比較規整,因為它是DWORD對齊的,所以在內存中進行圖像處理時可進行匯編級的代碼優化(簡單))。

(3) ClrUsed

BITMAPINFOHEADER結構中的成員ClrUsed指定實際使用的顏色數目。如果ClrUsed設置成0,位圖使用的顏色數目就等于biBitCount成員中的數目。請注意,如果ClrUsed的值不是可用顏色的最大值或不是0,則在編程時應該注意調色板尺寸的計算,比如在4位位圖中,調色板的缺省尺寸應該是16*sizeof(RGBQUAD),但是,如果ClrUsed的值不是16或者不是0,那么調色板的尺寸就應該是ClrUsed*sizeof(RGBQUAD)。

(4) 圖象數據壓縮

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

編碼方式:由2個字節組成,第一個字節指定使用相同顏色的象素數目,第二個字節指定使用的顏色索引。此外,這個字節對中的第一個字節可設置為0,聯合使用第二個字節的值表示:

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

絕對方式:第一個字節設置為0,而第二個字節設置為0x03~0xFF之間的一個值。在這種方式中,第二個字節表示跟在這個字節后面的字節數,每個字節包含單個象素的顏色索引。壓縮數據格式需要字邊界(word boundary)對齊。下面的例子是用16進制表示的8-位壓縮圖象數據:

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

壓縮數據

擴展數據

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 從當前位置右移5個位置后向下移一行
02 78 78 78
00 00 行結束
09 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E
00 01 RLE編碼圖象結束

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

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

絕對方式:這個字節對中的第一個字節設置為0,第二個字節包含有顏色索引數,其后續字節包含有顏色索引,顏色索引存放在該字節的高、低4位中,一個顏色索引對應一個象素。此外,BI_RLE4也同樣聯合使用第二個字節中的值表示:

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

下面的例子是用16進制數表示的4-位壓縮圖象數據:

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

這些壓縮數據可解釋為 :

壓縮數據

擴展數據

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 從當前位置右移5個位置后向下移一行
04 78 7 8 7 8
00 00 行結束
09 1E 1 E 1 E 1 E 1 E 1
00 01 RLE圖象結束

3. 彩色表

彩色表包含的元素與位圖所具有的顏色數相同,象素的顏色用RGBQUAD結構來定義。對于24-位真彩色圖象就不使用彩色表(同樣也包括16位、和32位位圖),因為位圖中的RGB值就代表了每個象素難丈 2噬 碇械難丈 囪丈 鬧匾 耘判潁 飪梢愿ㄖ 允廄 絳蛭 荒芟允咀愎歡嘌丈 南允舊璞趕允靜噬 枷蟆 GBQUAD結構描述由R、G、B相對強度組成的顏色,定義如下:

typedef struct tagRGBQUAD { /* rgbq */

BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;

} RGBQUAD;

 

其中:

rgbBlue

指定藍色強度

rgbGreen

指定綠色強度

rgbRed

指定紅色強度

rgbReserved

保留,設置為0

4. 位圖數據

緊跟在彩色表之后的是圖象數據字節陣列。圖象的每一掃描行由表示圖象象素的連續的字節組成,每一行的字節數取決于圖象的顏色數目和用象素表示的圖象寬度。掃描行是由底向上存儲的,這就是說,陣列中的第一個字節表示位圖左下角的象素,而最后一個字節表示位圖右上角的象素。(只針對與倒向DIB,如果是正向DIB,則掃描行是由頂向下存儲的),倒向DIB的原點在圖像的左下角,而正向DIB的原點在圖像的左上角。同時,每一掃描行的字節數必需是4的整倍數,也就是DWORD對齊的。如果你想確保圖像的掃描行DWORD對齊,可使用下面的代碼:

(((width*biBitCount)+31)>>5)<<2

posted on 2008-09-03 18:22 大海 閱讀(1162) 評論(0)  編輯 收藏 引用 所屬分類: 圖像

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲第一网站| 亚洲欧洲精品一区| 亚洲欧美日韩精品综合在线观看| 欧美三级免费| 欧美一二三视频| 欧美亚洲综合另类| 在线日本高清免费不卡| 欧美freesex交免费视频| 欧美成人综合一区| 亚洲先锋成人| 久久成人免费电影| 亚洲精品久久久蜜桃| 亚洲剧情一区二区| 国产欧美欧美| 欧美黄网免费在线观看| 欧美日韩亚洲另类| 久久精品论坛| 免费在线成人av| 欧美一级午夜免费电影| 久久夜色精品| 亚洲欧美另类在线| 美女尤物久久精品| 亚洲尤物在线| 毛片一区二区三区| 小嫩嫩精品导航| 欧美高清免费| 久久久青草青青国产亚洲免观| 欧美大片一区二区三区| 久久精品日韩一区二区三区| 欧美高潮视频| 久久偷看各类wc女厕嘘嘘偷窃| 欧美日韩精品一区二区在线播放| 香港久久久电影| 欧美激情亚洲精品| 久久亚洲综合网| 国产精品高潮粉嫩av| 亚洲国产电影| 黄色成人av在线| 中日韩美女免费视频网址在线观看 | 一本色道久久99精品综合| 国内成+人亚洲| 中文av一区二区| 亚洲人成久久| 久久嫩草精品久久久精品一| 欧美一区二区三区精品| 欧美日韩亚洲综合一区| 欧美不卡福利| 一区二区视频在线观看| 欧美一区久久| 欧美在线视频一区二区三区| 欧美日韩情趣电影| 亚洲欧洲日韩综合二区| 亚洲国产欧美日韩另类综合| 久久久久久穴| 巨胸喷奶水www久久久免费动漫| 国产欧美精品在线播放| 亚洲图片欧美一区| 午夜国产欧美理论在线播放 | 亚洲性线免费观看视频成熟| 日韩亚洲不卡在线| 欧美丰满高潮xxxx喷水动漫| 欧美国产日韩精品| 亚洲激情中文1区| 久久婷婷国产综合尤物精品| 美女诱惑一区| 亚洲激情av在线| 免费精品99久久国产综合精品| 免费在线观看日韩欧美| 一区二区在线视频观看| 久久久久久久久伊人| 巨乳诱惑日韩免费av| 亚洲国产二区| 欧美国产视频日韩| 日韩午夜激情电影| 午夜精品美女自拍福到在线| 国产农村妇女精品一区二区| 欧美在线一级视频| 欧美 日韩 国产在线| 日韩视频二区| 国产精品mv在线观看| 欧美亚洲免费高清在线观看| 久久久久亚洲综合| 亚洲全部视频| 欧美性猛交xxxx乱大交蜜桃| 亚洲欧美韩国| 欧美成人激情在线| 中文精品视频一区二区在线观看| 欧美午夜精品久久久久久人妖 | 亚洲日韩中文字幕在线播放| 国产精品99久久久久久久女警| 国产精品国色综合久久| 欧美一区二区三区在线观看| 欧美成人免费va影院高清| 一二三四社区欧美黄| 国产日韩精品入口| 女仆av观看一区| 亚洲视频在线观看视频| 久久综合网hezyo| 一本色道久久综合狠狠躁篇的优点| 国产精品一级二级三级| 久久资源av| 亚洲影视中文字幕| 亚洲国产日韩精品| 欧美一区二区在线观看| 最新国产の精品合集bt伙计| 国产精品实拍| 欧美激情一区二区三区在线视频观看 | 久久久久久亚洲精品杨幂换脸 | 亚洲自拍偷拍色片视频| 免费视频最近日韩| 午夜精品视频在线| 日韩视频久久| 黄色成人av在线| 国产精品美女一区二区在线观看| 麻豆精品视频在线观看| 性色av一区二区怡红| 亚洲欧洲精品一区二区三区不卡| 久久美女性网| 香蕉国产精品偷在线观看不卡| 亚洲人成人一区二区在线观看| 国产欧美精品日韩| 欧美日韩一区二区欧美激情| 免费人成精品欧美精品| 欧美一区精品| 午夜精品视频| 亚洲天堂网在线观看| 亚洲另类一区二区| 欧美激情影院| 欧美高潮视频| 麻豆精品视频在线观看视频| 久久xxxx精品视频| 午夜精品久久久久久久99樱桃 | 久久久夜精品| 午夜欧美精品| 亚洲欧美激情在线视频| 亚洲视频播放| 亚洲视频中文| 亚洲少妇中出一区| 夜夜狂射影院欧美极品| 99在线视频精品| 日韩一区二区福利| 中文一区二区| 亚洲五月六月| 亚洲欧美乱综合| 欧美亚洲网站| 久久精品国产96久久久香蕉 | 一区免费观看| 国产一区清纯| 伊伊综合在线| 亚洲国产精品女人久久久| 激情偷拍久久| 亚洲国产精品一区二区三区| 在线欧美福利| 亚洲精品综合精品自拍| 亚洲精品之草原avav久久| 亚洲精品中文字幕在线| 一区二区三区精品视频| 亚洲一区二区三区涩| 欧美一区二区三区精品| 久久久噜噜噜久久中文字幕色伊伊| 老司机精品视频网站| 欧美 日韩 国产一区二区在线视频| 欧美国产国产综合| 亚洲欧洲一区二区三区久久| 日韩亚洲视频| 欧美一站二站| 欧美精品二区三区四区免费看视频| 欧美另类videos死尸| 国产精品一卡二| 韩日精品视频| 一区二区激情| 久久露脸国产精品| 亚洲精品免费在线| 性欧美暴力猛交另类hd| 久久综合给合久久狠狠色| 欧美日韩喷水| 一区二区三区在线免费播放| 99精品99| 久久一区视频| 99综合视频| 久久久久亚洲综合| 欧美日韩免费观看一区二区三区| 国产欧美在线观看一区| 亚洲免费观看高清完整版在线观看熊 | 国产亚洲一级| 99热这里只有成人精品国产| 欧美一级片一区| 亚洲三级电影全部在线观看高清| 小黄鸭精品密入口导航| 欧美精品一区二区三区高清aⅴ| 国产欧美日本在线| 日韩亚洲成人av在线| 久久综合九色综合欧美狠狠| 国产精品99久久久久久宅男| 免费不卡中文字幕视频| 国产精品资源在线观看| 一区二区三区免费在线观看| 美女视频黄a大片欧美| 亚洲综合精品一区二区| 欧美美女福利视频|