GDI編程之 Bitmap
轉自:http://www.cnblogs.com/whyandinside/articles/1525924.html
DIB,全稱Device Independent Bitmap,設備無關位圖文件,這是一種文件格式,其目的是爲了保證用某個應用程序創建的位圖圖形可以被其它應用程序裝載或顯示一樣。 DIB(Device-indepentent bitmap)的與設備無關性主要體現在以下兩個方面:
- DIB的顏色模式與設備無關。例如,一個256色的DIB即可以在真彩色顯示模式下使用,也可以在16色模式下使用。
- 256色以下(包括256色)的DIB擁有自己的顏色表,像素的顏色獨立於系統調色板。
由於DIB不依賴於具體設備,因此可以用來永久性地保存圖象。DIB一般是以*.BMP文件的形式保存在磁盤中的,有時也會保存在*.DIB文件中。運行在不同輸出設備下的應用程序可以通過DIB來交換圖象。
DIB還可以用一種RLE算法來壓縮圖像數據,但一般來說DIB是不壓縮的。 DIB的結構:
在內存中,一個完整的DIB由兩部分組成:一個BITMAPINFO結構和一個存儲像素陣列的數組。BITMAPINFO描述了位圖的大小,顏色模式和調色板等各種屬性,其定義爲:
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];//顏色表
} BITMAPINFO, *PBITMAPINFO;
RGBQUAD結構用來描述顏色,其定義爲:
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
注意,RGBQUAD結構中的顏色順序是BGR,而不是平常的RGB。
BITMAPINFOHEADER結構包含了DIB的各種信息,其定義爲
typedef struct tagBITMAPINFOHEADER {
DWORD biSize; //該結構的大小
LONG biWidth; //位圖寬度,以pixel爲單位
LONG biHeight; //位圖高度,以pixel爲單位
WORD biPlanes; // 必須爲1
WORD biBitCount; //每個像素的位數(1、4、8、16、24或32)
DWORD biCompression; //壓縮方式,一般爲0或BI_RGB (未壓縮)
DWORD biSizeImage; //以字節爲單位的圖象大小(僅用於壓縮位圖)
LONG biXPelsPerMeter; //以目標設備每米的像素數來說明位圖的水平分辨率
LONG biYPelsPerMeter; //以目標設備每米的像素數來說明位圖的垂直分辨率
DWORD biClrUsed; /*顏色表的顏色數,若爲0則位圖使用由biBitCount指定的最大顏色數*/
DWORD biClrImportant; //重要顏色的數目,若該值爲0則所有顏色都重要
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
與DDB不同,DIB的字節數組是從圖象的最下面一行開始的逐行向上存儲的,也即等於把圖象倒過來然後在逐行掃描。另外,字節數組中每個掃描行的字節數必需是4的倍數,如果不足要用0補齊。DIB可以存儲在*.BMP或*.DIB文件中。DIB文件是以BITMAPFILEHEADER結構開頭的,該結構的定義爲
typedef struct tagBITMAPFILEHEADER {
WORD bfType; //文件類型,必須是BM
DWORD bfSize; //位圖文件的大小,字節爲單位
WORD bfReserved1;// 保留位,必須爲0
WORD bfReserved2;// 保留位,必須爲0
DWORD bfOffBits; // 從該數據結構開頭到位圖數據的偏移,字節爲單位
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
緊隨該結構的是一個BITMAPINFOHEADER結構,然後是RGBQUAD結構組成的顏色表(如果有的話),文件最後存儲的是DIB的像素陣列。
DIB的顏色信息儲存在自己的顏色表中,程序一般要根據顏色表爲DIB創建邏輯調色板。在輸出一幅DIB之前,程序應該將其邏輯調色板選入到相關的設備上下文中並實現到系統調色板中,然後再調用相關的GDI函數(如::SetDIBitsToDevice或::StretchDIBits)輸出DIB。在輸出過程中,GDI函數會把DIB轉換成DDB,這項工作主要包括以下兩步:
- 將DIB的顏色格式轉換成與輸出設備相同的顏色格式。例如,在真彩色的顯示模式下要顯示一個256色的DIB,則應該將其轉換成24位的顏色格式。
- 將DIB像素的邏輯顏色索引轉換成系統調色板索引。