看板Programming
标 题[分享] DIB 描绘程式要点与测试程式
发信站中正大学四百年来第一站 (Sat Jan 27 23:44:37 2007)
转信站ptt!ctu-reader!news.nctu!Firebird
完整文章链结:
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]