4. DIB位圖程式設計 4.1位圖檔案格式 先來分析DIB位圖檔案的格式。位圖檔案分為四部分: (1)位圖檔案頭BITMAPFILEHEADER 位圖檔案頭BITMAPFILEHEADER是一個結構體,長度為14位元組,定義為:
(2)位圖資訊頭BITMAPINFOHEADER 位圖資訊頭BITMAPINFOHEADER也是一個結構體,長度為40位元組,定義為:
(3)調色闆Palette 調色闆Palette針對的是需要調色闆的位圖,即單色、16色和256色位圖。對于不以調色闆方式存儲的位圖,則無此項資訊。調色闆是一個數組,共有biClrUsed個元素(如果該值為0,則有2biBitCount個元素)。數組中每個元素是一個RGBQUAD結構體,長度為4個位元組,定義為:
(4)實際的位圖資料ImageDate 對于用到調色闆的位圖,實際的圖象資料ImageDate為該象素的顔色在調色闆中的索引值;對于真彩色圖,圖象資料則為實際的R、G、B值: a.單色位圖:用1bit就可以表示象素的顔色索引值; b.16色位圖:用4bit可以表示象素的顔色索引值; c. 256色位圖:1個位元組表示1個象素的顔色索引值; d.真彩色:3個位元組表示1個象素的顔色R,G,B值。 此外,位圖資料每一行的位元組數必須為4的整倍數,如果不是,則需要補齊。奇怪的是,位圖檔案中的資料是從下到上(而不是從上到下)、從左到右方式存儲的。 4.2位圖的顯示
Visual C++ MFC中沒有提供一個專門的類來處理DIB位圖,是以,為了友善地使用位圖檔案,我們有必要派生一個CDib類。類的源代碼如下: (1) CDib類的聲明
從整個CDib類的代碼中我們可以看出,DIB位圖的顯示需遵循如下步驟: (1)讀取位圖,本類中使用pDib = new unsigned char[dwDibSize]為位圖中的資訊配置設定記憶體,另一種方法是調用API函數CreateDIBSection,譬如:
(2)根據讀取的位圖資訊,計算出調色闆大小,然後建立調色闆; (3)調用CDib::SetPalette( CDC *pDC )設定調色闆,需要用到CDC::SelectPalette及CDC::RealizePalette兩個函數; (4)調用CDib::Draw(CDC *pDC, int nX, int nY, int nWidth, int nHeight, int mode)函數繪制位圖。在此函數中,真正發揮顯示位圖作用的是對StretchDIBits API函數的調用。StretchDIBits函數具有縮放功能,其最後一個參數也是光栅操作的模式。 下面給出DIB位圖的打開及顯示并在其中加入天極網logo的函數源代碼。"DIB位圖"父菜單下"打開"子菜單的單擊事件消息處理函數為(其功能為打開位圖并顯示之):
5. 結束語 本文介紹了位圖及調色闆的概念,并講解了DDB位圖與DIB位圖的差別。在此基礎上,本文以執行個體講解了DDB位圖和DIB位圖的操作方式。DDB位圖的處理相對比較簡單,對于DIB位圖,我們需要定義一個MFC所沒有的新類CDib,它屏蔽位圖資訊的讀取及調色闆建立的技術細節,應用程式可以友善地使用之。 本文中的所有程式在Visual C++6.0及Windows XP平台上調試通過。 |