DIBSTRUCT結構

DIBHELP.C檔案-如此命名是因為對處理DIB提供幫助-有上千行,並在幾個小部分中顯示。

簡介

但是首先讓我們看一下DIBHELP函式所處理的結構,該結構在DIBHELP.C中定義如下:

typedef struct

{

PBYTE * ppRow ; // array of row pointers

int iSignature ; // = "Dib "

HBITMAP hBitmap ; // handle returned from CreateDIBSection

BYTE * pBits ; // pointer to bitmap bits

DIBSECTION ds ; // DIBSECTION structure

int iRShift[3] ; // right-shift values for color masks

int iLShift[3] ; // left-shift values for color masks

}

DIBSTRUCT, * PDIBSTRUCT ;

最後兩個欄位

DIBSECTION結構的最後兩個欄位指的是DIB區塊,此區塊由檔案映射建立。DIBHELP不使用CreateDIBSection的這個特性,因此可以忽略這些欄位。

DIBSTRUCT的最後兩個欄位儲存左右移位值,這些值用於處理16位元和32位元DIB的顏色遮罩。我們將在第十五章討論這些移位值。

讓我們再回來看一下DIBSTRUCT的第一個欄位。正如我們所看到的一樣,在開始建立DIB時,此欄位設定為指向一個指標陣列的指標,該陣列中的每個指標都指向DIB中的一行圖素。這些指標允許以更快的方式來獲得DIB圖素位元,同時也被定義,以便頂行可以首先引用DIB圖素位元。此陣列的最後一個元素-引用DIB圖像的最底行-通常等於DIBSTRUCT的pBits欄位。

第一個、第三個欄位

現在跳過第一個欄位。它之所以為第一個欄位是因為它使某些巨集更易於使用-在討論完其他欄位以後再來理解第一個欄位就更容易了。

在DIBHELP.C中,當DIB建立的函式首先設定了此結構時,第二個欄位就設定為文字字串「Dib」的二進位值。通過一些DIBHELP函式,第二個欄位將用於結構有效指標的一個標記。

第三個欄位,即hBitmap,是從CreateDIBSection函式傳回的點陣圖代號。您將想起該代號可有多種使用方式,它與我們在第十四章遇到的GDI點陣圖物件的代號用法一樣。不過,從CreateDIBSection傳回的代號將涉及按裝置無關格式儲存的點陣圖,該點陣圖格式一直儲存到通過呼叫BitBlt和StretchBlt來將位元圖畫到輸出設備。

DIBSTRUCT的第四個欄位是指向點陣圖位元的指標。此值也可由CreateDIBSection函式設定。您將想起,作業系統將控制這個記憶體塊,但套用程式有存取它的許可權。在刪除點陣圖代號時,記憶體塊將自動釋放。

DIBSTRUCT的第五個欄位是DIBSECTION結構。如果您有從CreateDIBSection傳回的點陣圖代號,那么您可以將代號傳遞給GetObject函式以獲得有關DIBSECTION結構中的點陣圖資訊:

GetObject (hBitmap, sizeof (DIBSECTION), &ds) ;

作為提示,DIBSECTION結構在WINGDI.H中定義如下:

typedef struct tagDIBSECTION {

BITMAP dsBm ;

BITMAPINFOHEADER dsBmih ;

DWORD dsBitfields[3] ; // Color masks

HANDLE dshSection ;

DWORD dsOffset ;

}

DIBSECTION, * PDIBSECTION ;

第一個欄位是BITMAP結構,它與CreateBitmapIndirect一起建立點陣圖物件,與GetObject一起傳回關於DDB的資訊。第二個欄位是BITMAPINFOHEADER結構。不管點陣圖資訊結構是否傳遞給CreateDIBSection函式,DIBSECTION結構總有BITMAPINFOHEADER結構而不是其他結構,例如BITMAPCOREHEADER結構。這意味著在存取此結構時,DIBHELP.C中的許多函式都不必檢查與OS/2相容的DIB。

對於16位元和32位元的DIB,如果BITMAPINFOHEADER結構的biCompression欄位是BI_BITFIELDS,那么在資訊表頭結構後面通常有三個遮罩值。這些遮罩值決定如何將16位元和32點陣圖素值轉換成RGB顏色。遮罩儲存在DIBSECTION結構的第三個欄位中。

相關搜尋

熱門詞條

聯絡我們