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

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 大海 閱讀(1158) 評論(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>
            亚洲精品一区久久久久久| 欧美午夜影院| 一区二区三区我不卡| 久久精品中文字幕免费mv| 亚洲一区在线观看免费观看电影高清| 欧美日韩国产美| 亚洲欧美成人综合| 午夜精品视频网站| 精品1区2区3区4区| 亚洲七七久久综合桃花剧情介绍| 久久黄金**| 日韩一级精品| 亚洲在线观看免费视频| 国产精品免费一区二区三区观看 | 国内激情久久| 国产欧美精品日韩区二区麻豆天美 | 国产精品乱码人人做人人爱| 一区二区三区四区五区视频| 亚洲视频一区| 韩国av一区二区| 亚洲国产小视频| 国产精品有限公司| 欧美国产精品va在线观看| 欧美精品福利在线| 久久久亚洲国产美女国产盗摄| 免费在线观看日韩欧美| 欧美一区二区三区在线看| 免费亚洲网站| 欧美资源在线观看| 欧美久久久久免费| 久久综合久久综合九色| 国产精品二区二区三区| 男人天堂欧美日韩| 国产精品久久久久久久电影| 欧美激情第3页| 国产毛片精品视频| 日韩午夜三级在线| 91久久精品美女高潮| 先锋影音网一区二区| 在线视频亚洲| 狂野欧美一区| 久久久久久亚洲综合影院红桃| 欧美日韩亚洲视频| 欧美激情中文字幕在线| 激情懂色av一区av二区av| 日韩一级网站| 午夜精品久久久久久99热软件| 中文av一区二区| 亚洲激情网站| 久久女同互慰一区二区三区| 小黄鸭视频精品导航| 欧美色网在线| 亚洲美女一区| 一区二区免费看| 欧美精品在线看| 欧美激情91| 亚洲美女在线视频| 牛人盗摄一区二区三区视频| 欧美69视频| 亚洲国产精品一区二区第四页av | 欧美成人有码| 欧美大香线蕉线伊人久久国产精品| 狠狠狠色丁香婷婷综合久久五月| 亚洲综合日韩中文字幕v在线| 亚洲专区免费| 国产精品视频yy9099| 亚洲综合日韩| 久久久久久亚洲精品杨幂换脸 | 欧美日韩在线播放三区| 亚洲毛片视频| 亚洲欧美另类国产| 国产美女一区| 欧美在线在线| 欧美黄网免费在线观看| 亚洲精品免费一二三区| 欧美国产精品一区| 亚洲午夜久久久久久尤物| 欧美日韩妖精视频| 国产精品99久久久久久人| 午夜日韩福利| 黑人巨大精品欧美黑白配亚洲 | 欧美在线免费| 欧美顶级少妇做爰| 一二三区精品| 国产麻豆精品视频| 美女露胸一区二区三区| 亚洲人成网站在线观看播放| 宅男噜噜噜66国产日韩在线观看| 国产精品高清一区二区三区| 性色av一区二区三区| 欧美激情导航| 午夜精品免费| 亚洲福利专区| 国产精品免费视频xxxx| 久久综合色8888| 99国产精品久久久久久久成人热| 欧美在线视频观看免费网站| 亚洲国产一区二区三区青草影视 | 国产美女一区| 欧美精品激情在线观看| 亚洲免费视频观看| 亚洲国产经典视频| 久久国产精品亚洲va麻豆| 99pao成人国产永久免费视频| 亚洲国产精品va在看黑人| 欧美日本免费| 香蕉国产精品偷在线观看不卡| 亚洲大胆女人| 久久精品五月| 亚洲视频一区二区免费在线观看| 激情久久五月天| 国产精品日产欧美久久久久| 蜜桃久久av| 欧美中文在线视频| 亚洲天堂网在线观看| 亚洲动漫精品| 看欧美日韩国产| 欧美一区二视频| 亚洲影院免费| 日韩一级大片| 亚洲日韩第九十九页| 国产一区二区精品久久| 欧美日韩在线电影| 欧美国产高潮xxxx1819| 久久中文在线| 久久久久久久性| 欧美一级一区| 性色av香蕉一区二区| 亚洲女同精品视频| 亚洲视频一区| 亚洲视频电影在线| 这里只有精品电影| 一本大道久久精品懂色aⅴ| 欧美大香线蕉线伊人久久国产精品| 久久精品人人| 久久亚洲精选| 麻豆国产精品va在线观看不卡| 久久精品亚洲一区二区| 久久国产欧美精品| 久久精品女人的天堂av| 久久精品国产99| 久久国产黑丝| 久久香蕉国产线看观看av| 久久婷婷影院| 欧美粗暴jizz性欧美20| 一区二区三区四区五区精品| 欧美视频一区在线| 欧美日韩中文| 国产精品久久久久永久免费观看| 欧美午夜宅男影院在线观看| 国产精品久久久久久久久果冻传媒| 国产精品美女久久久久久2018 | 欧美成人a视频| 欧美大胆成人| 国产精品成人一区二区网站软件| 国产精品s色| 国产亚洲福利一区| 亚洲国产成人精品久久久国产成人一区| 在线日本欧美| 日韩一区二区电影网| 亚洲免费影视第一页| 欧美专区福利在线| 欧美激情精品久久久久久久变态| 亚洲韩日在线| 国产精品99久久久久久久女警| 亚洲一区区二区| 久久伊人免费视频| 欧美激情精品久久久久久久变态| 欧美色综合天天久久综合精品| 国产日韩综合一区二区性色av| 精品动漫一区二区| 中文高清一区| 卡通动漫国产精品| 99国产精品久久久久久久久久| 午夜精品三级视频福利| 久久综合色88| 国产精品一区二区视频| 1024亚洲| 欧美一二三区精品| 欧美激情综合| 欧美亚洲一区二区在线观看| 久久亚洲综合网| 国产精品久久久久毛片大屁完整版| 欧美国产1区2区| 亚洲欧美国产制服动漫| 欧美夫妇交换俱乐部在线观看| 亚洲视频你懂的| 欧美1区3d| 国产欧美一区视频| 亚洲色图制服丝袜| 欧美黄色免费网站| 欧美在线视频免费观看| 欧美日韩一区二区三区免费| 亚洲成色777777在线观看影院| 亚洲欧美日韩精品久久奇米色影视 | 国产日韩在线看| 亚洲欧美美女| 亚洲精品一二区| 久久中文字幕导航| 国产亚洲网站|