DIB,全稱DeviceIndependentBitmap,設(shè)備無關(guān)位圖文件,這是一種文件格式,其目的是為了保證用某個應(yīng)用程序創(chuàng)建的位圖圖形可以被其它應(yīng)用程序裝載或顯示一樣。
DIB(Device-indepententbitmap)的與設(shè)備無關(guān)性主要體現(xiàn)在以下兩個方面:
DIB的顏色模式與設(shè)備無關(guān)。例如,一個256色的DIB即可以在真彩色顯示模式下使用,也可以在16色模式下使用。
256色以下(包括256色)的DIB擁有自己的顏色表,像素的顏色獨(dú)立于系統(tǒng)調(diào)色板。
由于DIB不依賴于具體設(shè)備,因此可以用來永久性地保存圖象。DIB一般是以*.BMP文件的形式保存在磁盤中的,有時也會保存在*.DIB文件中。運(yùn)行在不同輸出設(shè)備下的應(yīng)用程序可以通過DIB來交換圖象。
DIB還可以用一種RLE算法來壓縮圖像數(shù)據(jù),但一般來說DIB是不壓縮的。
DIB的結(jié)構(gòu)
與BorlandC++下的框架類庫OWL不同,MFC未提供現(xiàn)成的類來封裝DIB。盡管Microsoft列出了一些理由,但沒有DIB類確實(shí)給MFC用戶帶來很多不便。用戶要想使用DIB,首先應(yīng)該了解DIB的結(jié)構(gòu)。
在內(nèi)存中,一個完整的DIB由兩部分組成:一個BITMAPINFO結(jié)構(gòu)和一個存儲像素陣列的數(shù)組。BITMAPINFO描述了位圖的大小,顏色模式和調(diào)色板等各種屬性,其定義為
typedefstructtagBITMAPINFO{
BITMAPINFOHEADERbmiHeader;
RGBQUADbmiColors[1];//顏色表
}BITMAPINFO;
RGBQUAD結(jié)構(gòu)用來描述顏色,其定義為
typedefstructtagRGBQUAD{
BYTErgbBlue;//藍(lán)色的強(qiáng)度
BYTErgbGreen;//綠色的強(qiáng)度
BYTErgbRed;//紅色的強(qiáng)度
BYTErgbReserved;//保留字節(jié),為0
}RGBQUAD;
注意,RGBQUAD結(jié)構(gòu)中的顏色順序是BGR,而不是平常的RGB。
BITMAPINFOHEADER結(jié)構(gòu)包含了DIB的各種信息,其定義為
typedefstructtagBITMAPINFOHEADER{
DWORDbiSize;//該結(jié)構(gòu)的大小
LONGbiWidth;//位圖的寬度(以像素為單位)
LONGbiHeight;//位圖的高度(以像素為單位)
WORDbiPlanes;//必須為1
WORDbiBitCount//每個像素的位數(shù)(1、4、8、16、24或32)
DWORDbiCompression;//壓縮方式,一般為0或BI_RGB(未壓縮)
DWORDbiSizeImage;//以字節(jié)為單位的圖象大小(僅用于壓縮位圖)
LONGbiXPelsPerMeter;//以目標(biāo)設(shè)備每米的像素?cái)?shù)來說明位圖的水平分辨率
LONGbiYPelsPerMeter;//以目標(biāo)設(shè)備每米的像素?cái)?shù)來說明位圖的垂直分辨率
DWORDbiClrUsed;/*顏色表的顏色數(shù),若為0則位圖使用由biBitCount指定的顏色數(shù)*/
DWORDbiClrImportant;//重要顏色的數(shù)目,若該值為0則所有顏色都重要
}BITMAPINFOHEADER;
DIB(Device-indepententbitmap)的與設(shè)備無關(guān)性主要體現(xiàn)在以下兩個方面:
DIB的顏色模式與設(shè)備無關(guān)。例如,一個256色的DIB即可以在真彩色顯示模式下使用,也可以在16色模式下使用。
256色以下(包括256色)的DIB擁有自己的顏色表,像素的顏色獨(dú)立于系統(tǒng)調(diào)色板。
由于DIB不依賴于具體設(shè)備,因此可以用來永久性地保存圖象。DIB一般是以*.BMP文件的形式保存在磁盤中的,有時也會保存在*.DIB文件中。運(yùn)行在不同輸出設(shè)備下的應(yīng)用程序可以通過DIB來交換圖象。
DIB還可以用一種RLE算法來壓縮圖像數(shù)據(jù),但一般來說DIB是不壓縮的。
DIB的結(jié)構(gòu)
與BorlandC++下的框架類庫OWL不同,MFC未提供現(xiàn)成的類來封裝DIB。盡管Microsoft列出了一些理由,但沒有DIB類確實(shí)給MFC用戶帶來很多不便。用戶要想使用DIB,首先應(yīng)該了解DIB的結(jié)構(gòu)。
在內(nèi)存中,一個完整的DIB由兩部分組成:一個BITMAPINFO結(jié)構(gòu)和一個存儲像素陣列的數(shù)組。BITMAPINFO描述了位圖的大小,顏色模式和調(diào)色板等各種屬性,其定義為
typedefstructtagBITMAPINFO{
BITMAPINFOHEADERbmiHeader;
RGBQUADbmiColors[1];//顏色表
}BITMAPINFO;
RGBQUAD結(jié)構(gòu)用來描述顏色,其定義為
typedefstructtagRGBQUAD{
BYTErgbBlue;//藍(lán)色的強(qiáng)度
BYTErgbGreen;//綠色的強(qiáng)度
BYTErgbRed;//紅色的強(qiáng)度
BYTErgbReserved;//保留字節(jié),為0
}RGBQUAD;
注意,RGBQUAD結(jié)構(gòu)中的顏色順序是BGR,而不是平常的RGB。
BITMAPINFOHEADER結(jié)構(gòu)包含了DIB的各種信息,其定義為
typedefstructtagBITMAPINFOHEADER{
DWORDbiSize;//該結(jié)構(gòu)的大小
LONGbiWidth;//位圖的寬度(以像素為單位)
LONGbiHeight;//位圖的高度(以像素為單位)
WORDbiPlanes;//必須為1
WORDbiBitCount//每個像素的位數(shù)(1、4、8、16、24或32)
DWORDbiCompression;//壓縮方式,一般為0或BI_RGB(未壓縮)
DWORDbiSizeImage;//以字節(jié)為單位的圖象大小(僅用于壓縮位圖)
LONGbiXPelsPerMeter;//以目標(biāo)設(shè)備每米的像素?cái)?shù)來說明位圖的水平分辨率
LONGbiYPelsPerMeter;//以目標(biāo)設(shè)備每米的像素?cái)?shù)來說明位圖的垂直分辨率
DWORDbiClrUsed;/*顏色表的顏色數(shù),若為0則位圖使用由biBitCount指定的顏色數(shù)*/
DWORDbiClrImportant;//重要顏色的數(shù)目,若該值為0則所有顏色都重要
}BITMAPINFOHEADER;

