DIB區塊

DIB能擁有幾種色彩組織中的一種,DDB必須是單色的或是與真實輸出設備相同的格式。 DIB是一個檔案或記憶體塊;DDB是GDI點陣圖物件並由點陣圖代號表示。DIB能被顯示或轉換為DDB並轉換回DIB,但是這裡包含了裝置無關位元和設備相關位元之間的轉換程式。

基本介紹

  • 中文名:DIB區塊
  • 分類:計算機系統
  • 性質:名詞
  • 類型:語法
語法,解釋,注意事項,

語法

現在您將遇到一個函式,它打破了這些規則。該函式在32位元Windows版本中發表,稱為CreateDIBSection,語法為:
hBitmap = CreateDIBSection (
hdc, // device context handle
pInfo, // pointer to DIB information
fClrUse, // color use flag
ppBits, // pointer to pointer variable
hSection, // file-mapping object handle
dwOffset) ;// offset to bits in file-mapping object
CreateDIBSection是Windows API中最重要的函式之一(至少在使用點陣圖時),然而您會發現它很深奧並難以理解。

解釋

讓我們從它的名稱開始,我們知道DIB是什麼,但「DIB section」到底是什麼呢?當您第一次檢查CreateDIBSection時,可能會尋找該函式與DIB區塊工作的方式。這是正確的,CreateDIBSection所做的就是建立了DIB的一部分(點陣圖圖素位元的記憶體塊)。
現在我們看一下傳回值,它是GDI點陣圖物件的代號,這個傳回值可能是該函式呼叫最會拐人的部分。傳回值似乎暗示著CreateDIBSection在功能上與CreateDIBitmap相同。事實上,它只是相似但完全不同。實際上,從CreateDIBSection傳回的點陣圖代號與我們在本章和上一章遇到的所有點陣圖建立函式傳回的點陣圖代號在本質上不同。
一旦理解了CreateDIBSection的真實特性,您可能覺得奇怪為什麼不把傳回值定義得有所區別。您也可能得出結論:CreateDIBSection應該稱之為CreateDIBitmap,並且如同我前面所指出的CreateDIBitmap應該稱之為CreateDDBitmap。
首先讓我們檢查一下如何簡化CreateDIBSection,並正確地使用它。首先,把最後兩個參數hSection和dwOffset,分別設定為NULL和0,我將在本章最後討論這些參數的用法。第二,僅在fColorUse參數設定為DIB_ PAL_COLORS時,才使用hdc參數,如果fColorUse為DIB_RGB_COLORS(或0),hdc將被忽略(這與CreateDIBitmap不同,hdc參數用於取得與DDB相容的設備的色彩格式)。
因此,CreateDIBSection最簡單的形式僅需要第二和第四個參數。第二個參數是指向BITMAPINFO結構的指標,我們以前曾使用過。我希望指向第四個參數的指標定義的指標不會使您困惑,它實際上很簡單。
假設要建立每圖素24位元的384×256位元DIB,24位元格式不需要色彩對照表,因此它是最簡單的,所以我們可以為BITMAPINFO參數使用BITMAPINFOHEADER結構。
您需要定義三個變數:BITMAPINFOHEADER結構、BYTE指標和點陣圖代號:
BITMAPINFOHEADERbmih ;
BYTE * pBits ;
HBITMAP hBitmap ;
現在初始化BITMAPINFOHEADER結構的欄位
bmih->biSize = sizeof (BITMAPINFOHEADER) ;
bmih->biWidth = 384 ;
bmih->biHeight = 256 ;
bmih->biPlanes = 1 ;
bmih->biBitCount = 24 ;
bmih->biCompression = BI_RGB ;
bmih->biSizeImage = 0 ;
bmih->biXPelsPerMeter= 0 ;
bmih->biYPelsPerMeter= 0 ;
bmih->biClrUsed = 0 ;
bmih->biClrImportant= 0 ;
在基本準備後,我們呼叫該函式:
hBitmap = CreateDIBSection (NULL, (BITMAPINFO *) &bmih, 0, &pBits, NULL, 0) ;

注意事項

注意,我們為第二個參數賦予BITMAPINFOHEADER結構的位址。這是常見的,但一個BYIE指標pBits的位址,就不常見了。這樣,第四個參數是函式需要的指向指標的指標。
這是函式呼叫所做的:CreateDIBSection檢查BITMAPINFOHEADER結構並配置足夠的記憶體塊來載入DIB圖素位元。(在這個例子裡,記憶體塊的大小為384×256×3位元組。)它在您提供的pBits參數中儲存了指向此記憶體塊的指標。函式傳回點陣圖代號,正如我說的,它與CreateDIBitmap和其他點陣圖建立函式傳回的代號不一樣。
然而,我們還沒有做完,點陣圖圖素是未初始化的。如果正在讀取DIB檔案,可以簡單地把pBits參數傳遞給ReadFile函式並讀取它們。或者可以使用一些程式碼「人工」設定。

熱門詞條

聯絡我們