DIB
DIB(Device-indepentent bitmap)設(shè)備無關(guān)位圖,
與設(shè)備無關(guān)性主要體現(xiàn)在以下兩個方面:
??? DIB的顏色模式與設(shè)備無關(guān)。例如,一個256色的DIB即可以在真彩色顯示模式下使用,也可以在16色模式下使用。
??? 256色以下(包括256色)的DIB擁有自己的顏色表,像素的顏色獨立于系統(tǒng)調(diào)色板。
??? 由于DIB不依賴于具體設(shè)備,因此可以用來永久性地保存圖象。DIB一般是以*.BMP文件的形式保存在磁盤中的,有時也會保存在*.DIB文件中。運行在不同輸出設(shè)備下的應(yīng)用程序可以通過DIB來交換圖象。
??? DIB還可以用一種RLE算法來壓縮圖像數(shù)據(jù),但一般來說DIB是不壓縮的。
DIB的結(jié)構(gòu):
? 在內(nèi)存中,一個完整的DIB由兩部分組成:一個BITMAPINFO結(jié)構(gòu)和一個存儲像素陣列的數(shù)組。
BITMAPINFO描述了位圖的大小,顏色模式和調(diào)色板等各種屬性,其定義為
typedef struct tagBITMAPINFO {
? BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1]; //顏色表
} BITMAPINFO;
RGBQUAD結(jié)構(gòu)用來描述顏色,其定義為
? typedef struct tagRGBQUAD {
BYTE rgbBlue; //藍色的強度
? BYTE rgbGreen; //綠色的強度
? BYTE rgbRed; //紅色的強度
? BYTE rgbReserved; //保留字節(jié),為0
? } RGBQUAD;
注意,RGBQUAD結(jié)構(gòu)中的顏色順序是BGR,而不是平常的RGB。
? BITMAPINFOHEADER結(jié)構(gòu)包含了DIB的各種信息,其定義為
? typedef struct tagBITMAPINFOHEADER{
? DWORD biSize; //該結(jié)構(gòu)的大小
? LONG biWidth; //位圖的寬度(以像素為單位)
? LONG biHeight; //位圖的高度(以像素為單位)
? WORD biPlanes; //必須為1
? WORD biBitCount //每個像素的位數(shù)(1、4、8、16、24或32)
? DWORD biCompression; //壓縮方式,一般為0或BI_RGB (未壓縮)
? DWORD biSizeImage; //以字節(jié)為單位的圖象大小(僅用于壓縮位圖)
LONG biXPelsPerMeter; //以目標(biāo)設(shè)備每米的像素數(shù)來說明位圖的水平分辨率
? LONG biYPelsPerMeter; //以目標(biāo)設(shè)備每米的像素數(shù)來說明位圖的垂直分辨率
? DWORD biClrUsed; /*顏色表的顏色數(shù),若為0則位圖使用由biBitCount指定的最大顏色數(shù)*/
? DWORD biClrImportant; //重要顏色的數(shù)目,若該值為0則所有顏色都重要
? } BITMAPINFOHEADER;
BITMAPINFO結(jié)構(gòu)最后是調(diào)色板數(shù)據(jù),包含若干個RGBQUAD條目,一般來說最大為256個,定義為長度為1的數(shù)組是c語言里常用的一個技巧,用來定義可變長度的結(jié)構(gòu).你在程序里需要分配夠保存調(diào)色板的大小,最好把mBitmapInfo定義為一個指針
mBitmapInfo?=?(BITMAPINFO*)malloc(sizeof(BITMAPINFO)+256*sizeof(RGBQUAD));
與DDB不同,DIB的字節(jié)數(shù)組是從圖象的最下面一行開始的逐行向上存儲的,也即等于把圖象倒過來然后在逐行掃描。另外,字節(jié)數(shù)組中每個掃描行的字節(jié)數(shù)必需是4的倍數(shù),如果不足要用0補齊
總結(jié)
- 上一篇: 会计专业应用计算机操作,基于中职会计专业
- 下一篇: springboot和sping异同