使用資源—位圖
位圖(Bitmap)是Windows操作系統(tǒng)存儲圖像的方式,圖像中的每個像素對應(yīng)存儲器中的一個或多個數(shù)據(jù)位,如單色位圖每個像素對應(yīng)1位,16色位圖每個像素對應(yīng)4位,256色為8位,全彩色為24位等,所有的像素數(shù)據(jù)按照一行行的順序排列在存儲器中,每個像素對應(yīng)的位數(shù)稱為顏色深度。
位圖的優(yōu)越之處是操作的速度很快,計算機(jī)的屏幕顯示是由硬件從視頻緩沖區(qū)中的數(shù)據(jù)映射的,向視頻緩沖區(qū)中拷貝數(shù)據(jù)就可以直接將圖像顯示在屏幕上,所以以位圖的方式存儲像素,顯示圖形的時間幾乎就是向視頻緩沖區(qū)拷貝數(shù)據(jù)的時間。
位圖的不便之處一是尺寸問題:由于位圖是不壓縮的,它占用的空間很大,一個1024x768像素24位色的圖像的大小為1024x768x3字節(jié),達(dá)2.3MB;二是位圖的縮放問題,讀者都知道矢量和位圖之間的關(guān)系,矢量圖形(現(xiàn)在網(wǎng)上最流行的Flash就是矢量格式的)可以無限制縮放而不變形,因為它是根據(jù)矢量實時計算出像素數(shù)據(jù)的,而位圖縮放后要對原來的像素數(shù)據(jù)進(jìn)行插值計算,不可避免地會有失真。
在使用Windows的位圖之前,必須搞清楚幾個概念:位圖、設(shè)備無關(guān)位圖和位圖文件。
單純意義上的“位圖”指的就是存放在內(nèi)存中、可以馬上使用的位圖,它的顏色深度總是對應(yīng)當(dāng)前設(shè)備(如屏幕或打印機(jī)等)的顏色深度,不和具體的設(shè)備對應(yīng),位圖數(shù)據(jù)是沒有意義的,因為無法知道要把數(shù)據(jù)中的多少位解釋成一個像素。
對于存放在磁盤上或別的地方的位圖數(shù)據(jù)來說,它的顏色深度有可能和屏幕顏色深度不同,為了準(zhǔn)確描述它的顏色信息,必須有像素數(shù)據(jù)的屬性說明以及色彩表,在使用這個位圖的時候,可以根據(jù)這些信息將像素數(shù)據(jù)轉(zhuǎn)換到需要的顏色深度。色彩表和位圖數(shù)據(jù)合在一起就叫做設(shè)備無關(guān)位圖(DIB),因為它轉(zhuǎn)換后可以用在不同顏色深度的設(shè)備上。Windows有函數(shù)專門用來處理DIB。使用DIB唯一的問題是當(dāng)將高顏色數(shù)的DIB轉(zhuǎn)換到低顏色數(shù)的設(shè)備上時,由于色彩只能被轉(zhuǎn)換成設(shè)備所能表示的最相近的顏色,所以可能會有很大的顏色失真。
DIB可以存放在磁盤上的位圖文件中,位圖文件一般以bmp為擴(kuò)展名,它的內(nèi)容包括一個bitmap文件頭和DIB數(shù)據(jù),bitmap文件頭可以用來驗證整個文件的有效性。所以簡單地講,DIB是位圖數(shù)據(jù)的超集,位圖文件又是DIB的超集。
Windows支持的圖形文件格式只有bmp,ico與cur等幾種,可以廣泛用在GDI操作中的只有bmp文件,其他格式文件如jpg與tif等都是不能直接應(yīng)用的,要使用這些文件,必須在代碼中將它們轉(zhuǎn)換到位圖格式以后才行,所以要編寫一個僅支持bmp的圖片瀏覽器是很簡單的,而要支持其他格式麻煩就大了,僅jpg格式的解碼就是個很復(fù)雜的問題!
在資源中定義位圖
Windows對bmp文件的支持有兩種方法,一種是打開bmp文件讀入DIB部分的數(shù)據(jù),然后用函數(shù)將DIB數(shù)據(jù)轉(zhuǎn)換到位圖數(shù)據(jù);另一種方法就是在資源文件中用和ico,cur文件類似的方法定義位圖資源,然后在程序中裝入后使用。
在資源腳本文件中定義位圖資源的語法是:
位圖ID BITMAP [DISCARDABLE] 位圖文件名
在程序中可以用LoadBitmap函數(shù)裝入位圖資源:
invoke LoadBitmap, hInstance, lpBitmapName
.if eax
mov hBitmap, eax
.endif
LoadBitmap函數(shù)返回一個位圖句柄,在程序退出的時候,位圖句柄必須用DeleteObject函數(shù)釋放。對位圖資源的大部分操作涉及GDI的內(nèi)容,以后再詳細(xì)學(xué)習(xí)。