久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

BMP讀取(一)

 敬而遠(yuǎn) 2012-04-19

一、BMP圖片的文件結(jié)構(gòu)
BMP文件的數(shù)據(jù)在磁盤上是按以下順序存儲(chǔ)的:
[位圖文件頭TBitmapFileHeader][位圖信息頭TBitmapInfo][圖象數(shù)據(jù)BGRA]
每段的具體內(nèi)容如下:
TBitmapFileHeader= packed record
    bfType: Word;               //占2位,,文件標(biāo)識(shí)‘BM’
    bfSize: DWORD;             //占4位,,用字節(jié)表示的整個(gè)文件的大小
    bfReserved1: Word;       //占2位,保留字節(jié),,為0
    bfReserved2: Word;       //占2位,,保留字節(jié),,為0
    bfOffBits: DWORD;         //占4位,圖象數(shù)據(jù)RGBA的起始地址
end;

TBitmapInfo= packed record
    biSize: DWORD;                   //占4位,,位圖信息頭(Bitmap Info Header)的長(zhǎng)度,一般為$28  
    biWidth: Longint;                 //占4位,,位圖的寬度,以象素為單位  
    biHeight: Longint;                //占4位,,位圖的高度,,以象素為單位  
    biPlanes: Word;                   //占2位,位圖的位面數(shù)(注:該值將總是1)  
    biBitCount: Word;                //占2位,,每個(gè)象素的位數(shù),,設(shè)為32(32Bit位圖)  
    biCompression: DWORD;       //占4位,壓縮說(shuō)明,,設(shè)為0(不壓縮)    
    biSizeImage: DWORD;          //占4位,,用字節(jié)數(shù)表示的位圖數(shù)據(jù)的大小,。該數(shù)必須是4的倍數(shù)  
    biXPelsPerMeter: Longint;     //占4位,用象素/米表示的水平分辨率 
    biYPelsPerMeter: Longint;     //占4位,,用象素/米表示的垂直分辨率  
    biClrUsed: DWORD;              //占4位,,位圖使用的顏色數(shù)  
    biClrImportant: DWORD;       //占4位,指定重要的顏色數(shù)(到此處剛好40個(gè)字節(jié),,$28)  
    biImportant: DWORD;          //占4位,,調(diào)色板規(guī)范,,設(shè)為0       
end;

圖象數(shù)據(jù)BGRA:這段為實(shí)際圖像數(shù)據(jù),默認(rèn)的BMP是不支持ALPHA通道的,,但對(duì)32位BMP而言,,每個(gè)象素用32位(4個(gè)字節(jié))表示,前三個(gè)字節(jié)表示RGB分量,,最后一個(gè)字節(jié)可以做為ALPHA通道的值,,因此32位位圖可以存儲(chǔ)帶ALPHA通道的圖像,在文件中,,各分量的存儲(chǔ)順序?yàn)锽GRA,,BGRA,BGRA,,BGRA...
另外要注意的是,,BMP圖像的象素存儲(chǔ)順序是從下到上

在DX格式中也有微軟的描述:
All formats are listed from left to right, most-significant bit to least-significant bit. For example, D3DFORMAT_ARGB is ordered from the most-significant bit channel A (alpha), to the least-significant bit channel B (blue). When traversing surface data, the data is stored in memory from least-significant bit to most-significant bit, which means that the channel order in memory is from least-significant bit (blue) to most-significant bit (alpha).

if (pDevice->CreateTexture (bmih.biWidth,bmih.biHeight,
                                
1,0,D3DFMT_A8R8G8B8 ,
                                D3DPOOL_MANAGED
                                ,ppTexture,
0)==D3D_OK)
    
{
        res
=1;
        D3DLOCKED_RECT     stLockedRect;
        
        (
*ppTexture)->LockRect( 0&stLockedRect, 00 );
        BYTE 
*pch=(BYTE*)stLockedRect.pBits;
        
for (int i=bmih.biHeight-1;i>=0;i--)
        
{
            
for (int j=0;j<bmih.biWidth;j++)
            
{
                pch[
0]=bmpdata[i*bmih.biWidth*4+j*4+0];                //B
                pch[1]=bmpdata[i*bmih.biWidth*4+j*4+1];                //G
                pch[2]=bmpdata[i*bmih.biWidth*4+j*4+2];                //R
                pch[3]=bmpdata[i*bmih.biWidth*4+j*4+3];                //A
                pch+=4;            
            }

        }

        (
*ppTexture)->UnlockRect(0);
    }

我們?cè)阪i定一張紋理后,紋理的格式是D3DFMT_A8R8G8B8,我們進(jìn)行內(nèi)存操作的時(shí)候就是反向的B,G,R,A進(jìn)行賦值


BMP文件格式分析

簡(jiǎn)介

BMP(Bitmap-File)圖形文件是Windows采用的圖形文件格式,,在Windows環(huán)境下運(yùn)行的所有圖象處理軟件都支持BMP圖象文件格式,。Windows系統(tǒng)內(nèi)部各圖像繪制操作都是以BMP為基礎(chǔ)的。Windows 3.0以前的BMP圖文件格式與顯示設(shè)備有關(guān),,因此把這種BMP圖象文件格式稱為設(shè)備相關(guān)位圖DDB(device-dependent bitmap)文件格式,。Windows 3.0以后的BMP圖象文件與顯示設(shè)備無(wú)關(guān),因此把這種BMP圖象文件格式稱為設(shè)備無(wú)關(guān)位圖DIB(device-independent bitmap)格式(注:Windows 3.0以后,,在系統(tǒng)中仍然存在DDB位圖,,象BitBlt()這種函數(shù)就是基于DDB位圖的,只不過(guò)如果你想將圖像以BMP格式保存到磁盤文件中時(shí),,微軟極力推薦你以DIB格式保存),,目的是為了讓Windows能夠在任何類型的顯示設(shè)備上顯示所存儲(chǔ)的圖象。BMP位圖文件默認(rèn)的文件擴(kuò)展名是BMP或者bmp(有時(shí)它也會(huì)以.DIB.RLE作擴(kuò)展名),。

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

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

位圖文件的組成

結(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-01中。

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

 

 

偏移量

域的名稱

大小

內(nèi)容

 

 

 

圖象文件

0000h

文件標(biāo)識(shí)

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

注:因?yàn)?/span>OS/2系統(tǒng)并沒(méi)有被普及開,,所以在編程時(shí),,你只需判斷第一個(gè)標(biāo)識(shí)“BM”就行。

 

0002h

File Size

1 dword

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

 

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)的長(zhǎng)度,,用來(lái)描述位圖的顏色、壓縮方法等。下面的長(zhǎng)度表示:

28h - Windows 3.1x, 95, NT, …

0Ch - OS/2 1.x

F0h - OS/2 2.x

注:在Windows95,、98,、2000等操作系統(tǒng)中,位圖信息頭的長(zhǎng)度并不一定是28h,,因?yàn)槲④浺呀?jīng)制定出了新的BMP文件格式,,其中的信息頭結(jié)構(gòu)變化比較大,長(zhǎng)度加長(zhǎng),。所以最好不要直接使用常數(shù)28h,,而是應(yīng)該從具體的文件中讀取這個(gè)值。這樣才能確保程序的兼容性,。

 

0012h

Width

1 dword

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

 

0016h

Height

1 dword

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

 

001Ah

Planes

1 word

位圖的位面數(shù)(注:該值將總是1


圖象

信息

 

 

001Ch

Bits Per Pixel

1 word

每個(gè)象素的位數(shù)

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

4 - 16 色位圖

8 - 256 色位圖

16 - 16bit 高彩色位圖

24 - 24bit 真彩色位圖

32 - 32bit 增強(qiáng)型真彩色位圖

 

001Eh

Compression

1 dword

壓縮說(shuō)明:

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

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

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

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

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

根據(jù)BMP版本的不同而不同

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ù)

根據(jù)BMP版本及調(diào)色板尺寸的不同而不同

Bitmap Data

xxx bytes

該域的大小取決于壓縮方法及圖像的尺寸和圖像的位深度,它包含所有的位圖數(shù)據(jù)字節(jié),,這些數(shù)據(jù)可能是彩色調(diào)色板的索引號(hào),,也可能是實(shí)際的RGB值,這將根據(jù)圖像信息頭中的位深度值來(lái)決定,。




構(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ō)明文件的類型.(該值必需是0x4D42,,也就是字符'BM'。我們不需要判斷OS/2的位圖標(biāo)識(shí),,這么做現(xiàn)在來(lái)看似乎已經(jīng)沒(méi)有什么意義了,,而且如果要支持OS/2的位圖,程序?qū)⒆兊煤芊爆?。所以,,在此只建議你檢察'BM'標(biāo)識(shí)) 

bfSize

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

bfReserved1

保留,,必須設(shè)置為0

bfReserved2

保留,必須設(shè)置為0

bfOffBits

說(shuō)明從文件頭開始到實(shí)際的圖象數(shù)據(jù)之間的字節(jié)的偏移量,。這個(gè)參數(shù)是非常有用的,,因?yàn)槲粓D信息頭和調(diào)色板的長(zhǎng)度會(huì)根據(jù)不同情況而變化,,所以你可以用這個(gè)偏移值迅速的從文件中讀取到位數(shù)據(jù)。

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),,其中包含了有關(guān)位圖的尺寸及位格式等信息

bmiColors

說(shuō)明彩色表RGBQUAD結(jié)構(gòu)的陣列,,其中包含索引圖像的真實(shí)RGB值,。

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

biWidth

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

biHeight

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

biPlanes

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

biBitCount

說(shuō)明比特?cái)?shù)/象素,,其值為148,、16,、24、或32

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é)組成 

 

BI_BITFIELDS:每個(gè)象素的比特由指定的掩碼決定,。

biSizeImage

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

biXPelsPerMeter

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

biYPelsPerMeter

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

biClrUsed

說(shuō)明位圖實(shí)際使用的彩色表中的顏色索引數(shù)(設(shè)為0的話,,則說(shuō)明使用所有調(diào)色板項(xiàng))

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 表示位圖最多有兩種顏色,,缺省情況下是黑色和白色,你也可以自己定義這兩種顏色,。圖像信息頭裝調(diào)色板中將有兩個(gè)調(diào)色板項(xiàng),稱為索引0和索引1,。圖象數(shù)據(jù)陣列中的每一位表示一個(gè)象素。如果一個(gè)位是0,,顯示時(shí)就使用索引0RGB值,,如果位是1,則使用索引1RGB值,。

biBitCount=4 表示位圖最多有16種顏色,。每個(gè)象素用4位表示,并用這4位作為彩色表的表項(xiàng)來(lái)查找該象素的顏色,。例如,,如果位圖中的第一個(gè)字節(jié)為0x1F,,它表示有兩個(gè)象素,,第一象素的顏色就在彩色表的第2表項(xiàng)中查找,而第二個(gè)象素的顏色就在彩色表的第16表項(xiàng)中查找,。此時(shí),,調(diào)色板中缺省情況下會(huì)有16個(gè)RGB項(xiàng)。對(duì)應(yīng)于索引0到索引15,。

biBitCount=8 表示位圖最多有256種顏色,。每個(gè)象素用8位表示,并用這8位作為彩色表的表項(xiàng)來(lái)查找該象素的顏色,。例如,,如果位圖中的第一個(gè)字節(jié)為0x1F,這個(gè)象素的顏色就在彩色表的第32表項(xiàng)中查找,。此時(shí),,缺省情況下,調(diào)色板中會(huì)有256個(gè)RGB項(xiàng),,對(duì)應(yīng)于索引0到索引255,。

biBitCount=16 表示位圖最多有216種顏色。每個(gè)色素用16位(2個(gè)字節(jié))表示,。這種格式叫作高彩色,,或叫增強(qiáng)型16位色,或64K色,。它的情況比較復(fù)雜,,當(dāng)biCompression成員的值是BI_RGB時(shí),它沒(méi)有調(diào)色板,。16位中,,最低的5位表示藍(lán)色分量,中間的5位表示綠色分量,,高的5位表示紅色分量,,一共占用了15位,最高的一位保留,,設(shè)為0,。這種格式也被稱作555 16位位圖。如果biCompression成員的值是BI_BITFIELDS,,那么情況就復(fù)雜了,,首先是原來(lái)調(diào)色板的位置被三個(gè)DWORD變量占據(jù),,稱為紅、綠,、藍(lán)掩碼,。分別用于描述紅、綠,、藍(lán)分量在16位中所占的位置,。在Windows 95(或98)中,系統(tǒng)可接受兩種格式的位域:555565,,在555格式下,,紅、綠,、藍(lán)的掩碼分別是:0x7C00,、0x03E00x001F,,而在565格式下,,它們則分別為:0xF8000x07E0,、0x001F,。你在讀取一個(gè)像素之后,可以分別用掩碼上像素值,,從而提取出想要的顏色分量(當(dāng)然還要再經(jīng)過(guò)適當(dāng)?shù)淖笥乙撇僮鳎?。?/span>NT系統(tǒng)中,則沒(méi)有格式限制,,只不過(guò)要求掩碼之間不能有重疊,。(注:這種格式的圖像使用起來(lái)是比較麻煩的,不過(guò)因?yàn)樗娘@示效果接近于真彩,,而圖像數(shù)據(jù)又比真彩圖像小的多,,所以,它更多的被用于游戲軟件),。

biBitCount=24 表示位圖最多有224種顏色,。這種位圖沒(méi)有調(diào)色板(bmiColors成員尺寸為0),在位數(shù)組中,,每3個(gè)字節(jié)代表一個(gè)象素,,分別對(duì)應(yīng)于顏色RG,、B,。

biBitCount=32 表示位圖最多有232種顏色。這種位圖的結(jié)構(gòu)與16位位圖結(jié)構(gòu)非常類似,,當(dāng)biCompression成員的值是BI_RGB時(shí),,它也沒(méi)有調(diào)色板,,32位中有24位用于存放RGB值,順序是:最高位保留,,紅8位,、綠8位、藍(lán)8位,。這種格式也被成為888 32位圖,。如果 biCompression成員的值是BI_BITFIELDS時(shí),原來(lái)調(diào)色板的位置將被三個(gè)DWORD變量占據(jù),,成為紅,、綠,、藍(lán)掩碼,,分別用于描述紅、綠,、藍(lán)分量在32位中所占的位置,。在Windows 95(or 98)中,系統(tǒng)只接受888格式,,也就是說(shuō)三個(gè)掩碼的值將只能是:0xFF0000,、0xFF000xFF,。而在NT系統(tǒng)中,,你只要注意使掩碼之間不產(chǎn)生重疊就行。(注:這種圖像格式比較規(guī)整,,因?yàn)樗?/span>DWORD對(duì)齊的,,所以在內(nèi)存中進(jìn)行圖像處理時(shí)可進(jìn)行匯編級(jí)的代碼優(yōu)化(簡(jiǎn)單))。

(3) ClrUsed

BITMAPINFOHEADER結(jié)構(gòu)中的成員ClrUsed指定實(shí)際使用的顏色數(shù)目,。如果ClrUsed設(shè)置成0,,位圖使用的顏色數(shù)目就等于biBitCount成員中的數(shù)目。請(qǐng)注意,,如果ClrUsed的值不是可用顏色的最大值或不是0,,則在編程時(shí)應(yīng)該注意調(diào)色板尺寸的計(jì)算,比如在4位位圖中,,調(diào)色板的缺省尺寸應(yīng)該是16sizeof(RGBQUAD),,但是,如果ClrUsed的值不是16或者不是0,,那么調(diào)色板的尺寸就應(yīng)該是ClrUsedsizeof(RGBQUAD),。

(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)前開始的水平和垂直位置的偏移量。 

絕對(duì)方式:第一個(gè)字節(jié)設(shè)置為0,,而第二個(gè)字節(jié)設(shè)置為0x030xFF之間的一個(gè)值,。在這種方式中,第二個(gè)字節(jié)表示跟在這個(gè)字節(jié)后面的字節(jié)數(shù),,每個(gè)字節(jié)包含單個(gè)象素的顏色索引,。壓縮數(shù)據(jù)格式需要字邊界(word boundary)對(duì)齊。下面的例子是用16進(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

編碼方式:由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)前開始的水平和垂直位置的偏移量,。 

下面的例子是用16進(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-位真彩色圖象就不使用彩色表(同樣也包括16位,、和32位位圖),,因?yàn)槲粓D中的RGB值就代表了每個(gè)象素的顏色。彩色表中的顏色按顏色的重要性排序,,這可以輔助顯示驅(qū)動(dòng)程序?yàn)椴荒茱@示足夠多顏色數(shù)的顯示設(shè)備顯示彩色圖象,。RGBQUAD結(jié)構(gòu)描述由R,、GB相對(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é)表示位圖右上角的象素。(只針對(duì)與倒向DIB,,如果是正向DIB,,則掃描行是由頂向下存儲(chǔ)的),倒向DIB的原點(diǎn)在圖像的左下角,,而正向DIB的原點(diǎn)在圖像的左上角,。同時(shí),每一掃描行的字節(jié)數(shù)必需是4的整倍數(shù),,也就是DWORD對(duì)齊的。如果你想確保圖像的掃描行DWORD對(duì)齊,,可使用下面的代碼:

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

5. 參考書目

《圖象文件格式(上,、下)—Windows編程》
《圖像文件格式大全》
Programming Windows by Charles Petzold

6. 相關(guān)站點(diǎn)

各種格式:http://www./
各種格式:http://www.csdn.net/
位圖格式:http://www.cica./graphics/image_specs/bmp.format.txt

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(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)論公約

    類似文章 更多