[分享] DIB 描繪程式要點與測試程式
完整文章鏈結:
http://shukaiyang.myweb.hinet.net/dibtips/indextc.htm
* 若欲擷取 bottom-up 的 DIB 像素資料,則傳入 GetDIBits( ) 的 header 之
biHeight 數值為正數,否則若欲擷取 top-down 的 DIB 像素資料,則 header
之 biHeight 數值為負數。
* 在 GetDIBits( ) 的 lpvBits 參數傳入 NULL 以擷取 DIB 的尺寸資訊的時候,
必須將 header 的 biSize 設為 sizeof(BITMPAINFOHEADER),並將 biBitBount
設為零,否則若 hbmp 指向一個 256 色之點陣圖,傳回的資料會帶有 color
table 而造成記憶體寫入溢位。
* 使用GetDIBits( )擷取 DIB 像素資料的時候,header 的 biXPelsPerMeter,
biYPelsPerMeter, biClrUsed, biClrImportant 欄位未用到,均填入零即可。
若將 header 用於儲存 .bmp 檔案,通常 PelsPerMeter 數值可採用 120。
* 採用兩階段的 GetDIBits( ) 呼叫來擷取 DIB 的尺寸和像素資料的時候,在第
一次的呼叫過後,header 中的 biCompression 可能會被改寫為非零值(因點陣
圖檔案或資源為RLE或其他壓縮),若以同一個 header 作第二次的 GetDIBits()
呼叫,可能會因此而失敗,故程式員必須在第一次 GetDIBits( ) 呼叫過後確實
地將 header 中的 biCompression 寫為零(BI_RGB),以取得不壓縮的 DIB 編碼
資料。
* 以 biBitCount=16、biCompression=0 的 header 執行 GetDIBits( ) 呼叫所取
得的 DIB 像素資料乃是 r-g-b 為 5-5-5 的格式(最高位元無作用),若欲取得
5-6-5 的資料則 biCompression 必須為 BI_BITFIELDS,且在 header 資料之
後立即跟隨三個 DWORD 數值以指明 r-g-b 位元的 color mask,以 5-6-5 格式
來說分別是 0xF800, 0x07E0, 0x001F。
* 無論 DIB 資料為 bottom-up 或 top-down,SetDIBitsToDevice( ) 與
StretchDIBits( ) 當中 (XSrc, YSrc) 均是以 DIB 左下角為原點的 lower-left
座標(MSDN文件有誤)。
* 若 StretchDIBits( ) 想要達到 anti-aliasing 效果,可使用
SetStretchBltMode(hDC, HALFTONE)。
--
Shu-Kai Yang's Freeware and Programming Tutorials:
* 3D Graphics, Game, Multimedia Goodies at
* http://shukaiyang.myweb.hinet.net/indextc.htm
--
※ 來源:‧四百年來第一站 firebird.cs.ccu.edu.tw‧[FROM: 122-124-100-138]