GDI程式設計之 Bitmap

2021-06-08 12:36:23 字數 2564 閱讀 8948

dib,全稱device independent bitmap,裝置無關位**件,這是一種檔案格式,其目的是為了保證用某個應用程式建立的點陣圖圖形可以被其它應用程式裝載或顯示一樣。 dib(device-indepentent bitmap)的與裝置無關性主要體現在以下兩個方面:

由於dib不依賴於具體裝置,因此可以用來永久性地儲存圖象。dib一般是以*.bmp檔案的形式儲存在磁碟中的,有時也會儲存在*.dib檔案中。執行在不同輸出裝置下的應用程式可以通過dib來交換圖象。

dib還可以用一種rle演算法來壓縮影象資料,但一般來說dib是不壓縮的。 dib的結構:

在記憶體中,乙個完整的dib由兩部分組成:乙個bitmapinfo結構和乙個儲存畫素陣列的陣列。bitmapinfo描述了點陣圖的大小,顏色模式和調色盤等各種屬性,其定義為:

typedef struct tagbitmapinfo  bitmapinfo, *pbitmapinfo;
rgbquad結構用來描述顏色,其定義為:

typedef struct tagrgbquad  rgbquad;

注意,rgbquad結構中的顏色順序是bgr,而不是平常的rgb。

bitmapinfoheader結構包含了dib的各種資訊,其定義為:

typedef struct tagbitmapinfoheader  bitmapinfoheader, *pbitmapinfoheader;

與ddb不同,dib的位元組陣列是從圖象的最下面一行開始的逐行向上儲存的,也即等於把圖象倒過來然後在逐行掃瞄。另外,位元組陣列中每個掃瞄行的位元組數必需是4的倍數,如果不足要用0補齊。dib可以儲存在*.bmp或*.dib檔案中。dib檔案是以bitmapfileheader結構開頭的,該結構的定義為:

typedef struct tagbitmapfileheader  bitmapfileheader, *pbitmapfileheader;

緊隨該結構的是乙個bitmapinfoheader結構,然後是rgbquad結構組成的顏色表(如果有的話),檔案最後儲存的是dib的畫素陣列。

dib的顏色資訊儲存在自己的顏色表中,程式一般要根據顏色表為dib建立邏輯調色盤。在輸出一幅dib之前,程式應該將其邏輯調色盤選入到相關的裝置上下文中並實現到系統調色盤中,然後再呼叫相關的gdi函式(如::setdibitstodevice或::stretchdibits)輸出dib。在輸出過程中,gdi函式會把dib轉換成ddb,這項工作主要包括以下兩步:

將dib的顏色格式轉換成與輸出裝置相同的顏色格式。例如,在真彩色的顯示模式下要顯示乙個256色的dib,則應該將其轉換成24位的顏色格式。

將dib畫素的邏輯顏色索引轉換成系統調色盤索引。

位圖資訊頭bitmapinfoheader,也是乙個結構,其定義如下:

typedef struct tagbitmapinfoheader bitmapinfoheader;

這個結構的長度是固定的,為40個位元組(long為32位整數),各個域的說明如下:

bisize

指定這個結構的長度,為40。

biwidth

指定圖象的寬度,單位是象素。

biheight

指定圖象的高度,單位是象素。

biplanes

必須是1,不用考慮。

bibitcount

指定表示顏色時要用到的位數,常用的值為1(黑白二色圖), 4(16色圖), 8(256色), 24(真彩色圖)(新的.bmp格式支援32位色,這裡就不做討論了)。

bicompression

指定位圖是否壓縮,有效的值為bi_rgb,bi_rle8,bi_rle4,bi_bitfields(都是一些windows定義好的常量)。要說明的是,windows點陣圖可以採用rle4,和rle8的壓縮格式,但用的不多。我們今後所討論的只有第一種不壓縮的情況,即bicompression為bi_rgb的情況。

bisizeimage

指定實際的點陣圖資料占用的位元組數,其實也可以從以下的公式中計算出來:

bisizeimage=biwidth』 × biheight

要注意的是:

上述公式中的biwidth』必須是4的整倍數(所以不是biwidth,而是biwidth』,表示大於或等於biwidth的,最接近4的整倍數。舉個例子,如果biwidth=240,則biwidth』=240;如果biwidth=241,biwidth』=244)。

如果bicompression為bi_rgb,則該項可能為零

bixpelspermeter

指定目標裝置的水平解析度,單位是每公尺的象素個數,關於解析度的概念。

biypelspermeter

指定目標裝置的垂直解析度,單位同上。

biclrused

指定本圖象實際用到的顏色數,如果該值為零,則用到的顏色數為2bibitcount。

biclrimportant

指定本圖象中重要的顏色數,如果該值為零,則認為所有的顏色都是重要的。

GDI程式設計之 一 GDI相關概念

一 gdi相關概念 1 gdi graphics device inte ce 圖形裝置介面,是乙個應用程式與輸出裝置之間的中介。它提供了一套函式庫,這些函式在不同的輸出裝置上輸出圖形和文字。一方面,gdi向應用程式提供乙個與裝置無關的程式設計環境,另一方面,它又以裝置相關的格式和具體的裝置打交道。...

GDI 遊戲程式設計之2 GDI 基本使用

gdi 就是 window系統提供了一些函式,gdi 就是.net裡面對這些函式的封裝,這些函式主要是在system.drawing 裡面,他包含了 繪圖裝置,畫筆,畫刷,顏色等各種東西,反正就是那些視窗控制項什麼的都是用他畫出來的,比如 按鈕,選單 滾動條什麼的。gdi gdi 就是window系...

GDI 遊戲程式設計之1 基本要求

本教程開始,剛才寫了幾百字結果沒儲存,現在就不廢話了,不要那些了,本教程教你gdi 的使用,最終完成一些小遊戲開發,請確定具備以下知識,否則就不看算了。1.喜歡程式設計,不喜歡看了搞屁。2.重灌系統基本維護電腦硬體起碼都搞得清楚。3.語法,運算元據庫,什麼的常見的都要會。4.玩過一些遊戲,遊戲沒玩過...