CreateDIBSection、BITMAPINFO、BITMAPINFOHEADER、RGBQUAD

CreateDIBSection

 

該函數創建應用程序可以直接寫入的、與設備無關的位圖(DIB)。該函數返回一個位圖句柄。

原型:    

 

HBITMAP CreateDIBSection(
        HDC                  hdc,
        CONST BITMAPINFO *   pbmi,
        UINT                 iUsage,
        VOID *               ppvBits,
        HANDLE               hSection,
        DWORD                dwOffset);

參數:    

hdc:設備環境句柄。如果iUsage的值是DIB_PAL_COLORS,那麼函數使用該設備環境的邏輯調色板對與設備無關位圖的顏色進行初始化。

pbmi:指向BITMAPINFO結構的指針,該結構指定了設備無關位圖的各種屬性,其中包括位圖的尺寸和顏色。

iUsage:指定由pbmi參數指定的BITMAPINFO結構中的成員bmiColors數組包含的數據類型(要麼是邏輯調色板索引值,要麼是原文的RGB值)。下列值是系統定義的,其含義爲:

 

描述

DIB_RGB_COLORS

根據BITMAPINFOHEADER biCompression 成員決定BITMAPINFO 結構包含位掩碼還是調色板數組,在呈現位圖時使用該數組值。DIB_RGB_COLORS 可以在任何位數的位圖上使用。

DIB_PAL_COLORS

BITMAPINFO.bmiColors 數組被取消,在呈現位圖時使用目標調色板。DIB_PAL_COLORS只能在8bpp位圖中指定。

 

ppvBits:指向一個變量的指針,該變量接收一個指向DIB位數據值的指針。

hSection:該參數設置爲NULL。

dwOffset:參數取消。

返回值:

   成功,返回值是一個指向剛剛創建的設備無關位圖的句柄,並且*ppvBits指向該位圖的位數據值;失敗,那麼返回值爲NULL,並且*ppvBit也爲NULL,若想獲得更多錯誤信息,請調用GetLastError函數。

備註:

   系統爲設備獨立位圖分配內存。如果在之後調用DeleteObject來刪除設備獨立位圖,系統自動關閉內句柄。

   在Windows CE 2.0及其以後版本,如果圖像是調色板模式(通常是1,2,4和8格式)的,BITMAPINFO 結構中必須包含一個顏色表。對於16bpp或32bpp非調色板圖像,顏色表必須是3個入口的長度,這3個入口必須指定紅、綠、藍色掩碼。 而且,BITMAPINFOHEADER 結構的biCompression 成員應該被設置爲BI_BITFIELDS。 這些位深不支持BI_RGB。 GDI取消24bpp圖像的顏色表,他們的像素必須被存儲爲 藍-綠-紅 (BGR)格式。

   Windows CE 不支持332位閾設備。

   在Windows CE 1.0 和 1.01版本,pbmi指向的BITMAPINFO結構必須指定每個像素點爲1或2位。

 

BITMAPINFO

該結構定義了基於Windows的設備獨立位圖(DIB)的尺寸大小和顏色信息

原型:

 

typedef struct tagBITMAPINFO { 
    BITMAPINFOHEADER  bmiHeader
    RGBQUAD           bmiColors[1]; 
BITMAPINFO;

成員:

bmiHeader: 位圖信息頭結構,該結構包含了位圖的尺寸和顏色格式。

bmiColors: 包含下面中的一種。

  • RGBQUAD 數組。數組元素填充顏色表。
  • 16位無符號整形數組,該數組指定索引到當前已實現的邏輯調色板。

    允許在使用DIB的函數中使用bmiColors 。當bmiColors 包含已實現的邏輯調色板的索引時,必須也要調用CreateDIBPatternBrushPt CreateDIBSection CreateDIBSection iUsage 成員必須被設置爲DIB_PAL_COLORS 

    BITMAPINFOHEADER 結構的biBitCount 和 biClrUsed 成員的值決定數組的大小。

    bmiColors 表中的顏色根據重要性排序。更多信息,參見備註。
  • 如果bmiHeader.biCompression 被設置爲BI_RGB ,可以設置bmiColors 數組大小爲0.

備註:

   設備獨立位圖由2部分組成:用於描述位圖的尺寸大小和顏色的BITMAPINFO 結構和定義位圖像素的字節數組。字節數組中的所有位封裝在一起,但每行掃描必須在行尾補0以確保行尾爲LONG數據類型邊界(each scan line must be padded with zeroes to end on a LONG data-type boundary.)。

   如果位圖高度爲正數,則位圖爲從下到上(bottom-up)DIB,它的起點爲左下角座標。如果高度爲負數,則位圖爲從上到下(top-down) DIB,它的起點爲左上角。

封裝位圖時,位圖字節數組緊跟在BITMAPINFO 頭後面。封裝的位圖被一個單獨指針引用。 

   對於封裝的位圖,當使用DIB_PAL_COLORS模式時,BITMAPINFOHEADER 結構的ClrUsed 成員必須設置爲偶數,因此,DIB位圖數組以DWORD邊界開始。

   如果位圖被存儲至文件或傳送到其他應用程序,bmiColors 成員不應包含調色板索引。

   除非程序獨佔使用和控制位圖,否則位圖顏色表應該包含明確的RGB值。

 

        安全提示: 一個常見的錯誤類型包括在內容中發現無效的格式描述。比如,一個BITMAPINFOHEADER結構後跟着一個顏色表。

   BITMAPINFO 結構被定義爲一個BITMAPINFOHEADER 結構後跟着一個填充顏色表RGBQUAD 數組。RGBQUAD 數組大小由BITMAPINFOHEADER 中的biClrUsed值決定。

   在拷貝顏色表到BITMAPINFO前一定要檢查爲BITMAPINFO結構分配的緩衝大小,否則決不能那麼做

 

 

BITMAPINFOHEADER

該結構包含設備獨立位圖的尺寸大小和顏色格式信息。

原型: 

 

typedef struct tagBITMAPINFOHEADER { 
    DWORD       biSize
    LONG        biWidth
    LONG        biHeight
    WORD        biPlanes
    WORD        biBitCount 
    DWORD       biCompression
    DWORD       biSizeImage
    LONG        biXPelsPerMeter
    LONG        biYPelsPerMeter
    DWORD       biClrUsed
    DWORD       biClrImportant
BITMAPINFOHEADER;

成員:

biSize:指定結構體大小,按字節計算,不包括biClrUsed 成員提及的顏色表或掩碼的大小。參見備註。

biWidth: 位圖的寬度,按像素計算。

biHeight: 位圖的高度,按像素計算。

    如果biHeight爲正數,位圖爲從下而上(bottom-up) DIB ,起點爲左下角。

    如果biHeight爲負數,位圖爲從上而下(top-down) DIB ,起點爲左上角,

    如果biHeight爲負數,標識一個從上而下(top-down) DIB,biCompression 必須爲BI_RGB BI_BITFIELDS。從上而下(top-down) DIB不能被壓縮。

biPlanes:指定目標設備的planes的數量。 必須設定爲 1 。

biBitCount:指定每個像素的位數。

    該成員決定位圖中定義每個像素的位數和最大顏色數量。 該成員必須爲下面值中的一個:

 

描述

1

位圖爲黑白色,bmiColors 成員包含兩個入口。位圖數組中的每位代表一個像素。
如果該位被清除,像素被顯示爲
bmiColors 表的第一個入口的顏色。
如果顏色被設置了,像素擁有
bmiColors 表第二個入口的顏色。

2

位圖有4個可能的顏色值。

4

位圖有最大16位色,bmiColors 成員最多包含16個入口。

顏色表按照4位索引呈現位圖中每個像素。例如,如果位圖中的第一個字節是Ox1F,該字節代表2個像素。第一個像素包含第二個表入口的顏色,第二個像素包含第16個表入口的顏色。

8

位圖最多有256中顏色,bmiColors 成員包含最多256個入口。這種情況下,數組中的每個字節代表單獨一個像素。

16

位圖最多有2^16 種顏色。 

如果BITMAPINFOHEADER biCompression 成員值爲BI_RGB  bmiColors NULL位圖數組中的每個字(WORD)代表單獨一個像素。紅、綠、藍的相對強度分別以5位呈現藍色值爲最低有效5位,接着5位是綠,然後是紅。最高有效位不被使用。bmiColors 顏色表用來優化使用在基於調色板的設備上的顏色,而且必須包含BITMAPINFOHEADERbiClrUsed 成員指定的入口數量。

24

位圖最多有2^24種顏色。bmiColors NULL

位圖數組中每個3字節三元組分別代表每個像素的藍、綠、紅色的相對強度。bmiColors 顏色表用來優化使用在基於調色板的設備上的顏色,而且必須包含BITMAPINFOHEADERbiClrUsed 成員指定的入口數量。

32

位圖最多有2^32種顏色。

如果BITMAPINFOHEADER biCompression 成員是BI_RGB  bmiColors NULL。位圖數組中的每個雙字(DWORD)分別代表每個像素的藍、綠、紅色的相對強度。每個雙字的高字節不使用。bmiColors 顏色表用來優化使用在基於調色板的設備上的顏色,而且必須包含BITMAPINFOHEADERbiClrUsed 成員指定的入口數量。

如果BITMAPINFOHEADER biCompression 的值爲BI_BITFIELDSbmiColors 成員包含3個雙字顏色掩碼來分別指定組成每個像素的紅、綠、藍色。

位圖數組中的每個雙字代表一個像素。


biCompression:爲壓縮的bottom-up位圖指定壓縮類型,而top-down DIBs 不能被壓縮。該成員值可能爲下表中的一個:

 

 

描述

BI_RGB  

未壓縮的格式

BI_BITFIELDS 

用來說明位圖沒有被壓縮並且顏色表由3個雙字顏色掩碼組成(3個雙字顏色掩碼來分別指定組成每個像素的紅、綠、藍值)。

當使用16bpp32bpp位圖時該標誌可用。

該值在Windows CE 2.0 及其以後版本可用。

BI_ALPHABITFIELDS  

用來說明位圖沒有被壓縮並且顏色表由4個雙字顏色掩碼組成(4個雙字顏色掩碼來分別指定組成每個像素的紅、綠、藍和alpha值)。

當使用16bpp32bpp位圖時該標誌可用。

該值在Windows CE 4.0 及其以後版本可用。

 

    對於Windows CE 5.0 及其以後版本,可有使用上表的任意值與BI_SRCPREROTATE 進行布爾OR 運算來標明源DIB和目的DIB有相同的旋轉角度。

biSizeImage:指定圖像的大小,按字節計算。當爲BI_RGB 時,該值可以設置爲0。

biXPelsPerMeter:爲位圖指定目標設備水平分辨率,按每公尺像素數計算(in pixels per meter)。程序使用該值從資源組中選擇最符合當前設備特性的位圖。

biYPelsPerMeter:爲位圖指定目標設備垂直分辨率按每公尺像素數計算(in pixels per meter)。

biClrUsed:指定實際在位圖中使用的顏色表中的顏色索引的數量。

    如果該值爲0,位圖爲biCompression 指定的壓縮模式使用biBitCount 值對應的最大顏色數量。
    如果biClrUsed 非0,並且biBitCount 小於16,biClrUsed 指定圖形引擎或設備驅動訪問的實際顏色數量。
    如果biBitCount 大於等於16,biClrUsed 指定顏色表的數量,用來優化系統顏色調色板性能。
    如果biBitCount 等於16或32,最佳顏色調色板緊跟在3個雙字掩碼之後開始(the optimal color palette starts immediately following the three DWORD masks.)。
    如果位圖被封裝了(位圖數組緊接着BITMAPINFO頭,並被一個單獨指針引用),biClrUsed 必須要麼爲0,要麼爲顏色表的實際大小。

biClrImportant:顯示位圖時指的定顏色索引的數量。如果該值爲0,要求使用所有顏色。

備註:

   BITMAPINFO 結構合併BITMAPINFOHEADER和一個顏色表來提供對一個DIB的尺寸大小和顏色的完全定義。程序應該使用存儲在biSize 中的信息來定位BITMAPINFO 結構中的顏色表,如下,

pColor = ((LPSTR)pBitmapInfo + (WORD)(pBitmapInfo->bmiHeader.biSize));

   對於Windows CE 1.0 和1.01版本,biBitCount 必須爲1或2.

 

RGBQUAD

該結構用於描述一種顏色的紅、綠、藍的相對強度。

原型:

 

typedef struct tagRGBQUAD { 
    BYTE   rgbBlue;
    BYTE   rgbGreen;
    BYTE   rgbRed;
    BYTE   rgbReserved;
RGBQUAD;

成員:

rgbBlue、rgbGreen、rgbRed:分別指定藍、綠、紅色的強度。rgbReserved是保留值,設置爲0。

備註:

Windows CE 不支持rgbReserved,應該初始化爲0。BITMAPINFO結構的bmiColors 成員由RGBQUAD 結構數組組成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章