DrawDib函数组的使用
2008-02-23 05:35:47来源:互联网 阅读 ()
Microsoft的针对和设备无关位图(DIB位图),在其WIN32 SDK的Multimedia中提供了一组绘制DIB位图的高性能函数组──DrawDib函数组。DrawDib函数组是一组不依赖于图像设备接口(GDI)函数,而直接操作显存的函数组。他们支持8位、16位、24位和32位图象深度的DIB。总的来说,DrawDib函数组类似于StretchDIBits函数,他们都提供了将图象拉伸和抖动的功能,然而,DrawDib函数组还支持图象的解压、数据流连同更多的显示适配器。在某些情况下,DrawDib函数组还具备更大的优越性。但是,在某些场合下,DrawDib函数组却不能取代StretchDIBits函数。下面就DrawDib函数组和StretchDIBits函数使用的场合加以区别和说明:
颜色信息表格式。DrawDib函数组只支持颜色信息表格式为DIB_RGB_COLORS格式的图象,假如要显示以DIB_PAL_COLORS或DIB_PAL_INDICES格式的图象,则必须用StretchDIBits函数。
光栅操作模式。DrawDib函数组只能使用SRCCOPY光栅操作模式,假如需要不但仅使用SRCCOPY模式的话,只能用StretchDIBits函数。同样地,假如要使用其他光栅操作,例如XOR,只能用StretchDIBits函数。
视频及动画回放的质量。DrawDib函数组支持数据流应用,诸如视频片和动画序列,他比StretchDIBits函数提供了更高的图象质量连同对回放过程的改进。
显示适配器。DrawDib函数组比StretchDIBits函数支持更多的显示适配器。DrawDib函数组支持使用4位图象深度提供16色调色板的VGA适配器,使用8位图象深度提供256色调色板的SVGA适配器和使用16位、24位和32位图象深度提供成千上万种颜色的真彩色适配器。DrawDib函数组还使用了受限制的潜在能力提高了图象在显示适配器上的速度和质量。例如,当使用8位的显示适配器时,DrawDib函数组有效地将真彩色图象抖动为256色;同样的,使用4位的显示适配器时,他们也将8位深度的图象抖动成4位。
图象拉伸。正如StretchDIBits相同,DrawDib函数组用源矩形和目的矩形来控制一个图象显示的部分。能够通过改变源矩形和目的矩形的位置和大小来裁剪一幅图象无需的部分和拉伸某部分。假如显示驱动不支持图象拉伸,那么DrawDib函数组提供了比StretchDIBits函数更有效的拉伸能力。
压缩图象。DrawDib函数组支持好几种压缩和解压方法,其中包括游程编码,JPEG,Cinepak,411YUV和Indeo™。
DrawDib的操作
通过使用DrawDibOpen函数初始化DrawDib函数组。DrawDibOpen负责装载动态连接库(DLL),申请内存资源,DrawDib设备环境(DC),并且维持初始化相关的设备环境计数。DrawDibOpen同时返回一个其他DrawDib函数所需要使用的新的DC句柄。
当使用完DrawDib DC后,能够用DrawDibClose函数释放他。DrawDibClose同时减少存取DLL的应用的计数。在应用程式中,DrawDibClose函数应是最后的DrawDib操作。
能够创建任意多的DrawDib DC,也能够同时使用多个DrawDib DC来绘制几幅位图。在应用程式中能够创建多个不同性质的DrawDib DC,这样就能够选择最合适的DC配置。例如,在同一应用程式中,创建两个不同的DrawDib DC,一个用来显示图象的正常分辨率,另一个用来显示图象的放大部分。
为了更有效地运行,DrawDib函数组需要知道显示适配器及其驱动的信息。显示配置信息是在第一次使用包含DrawDib函数组的DLL时,对显示适配器通过了一系列的测试之后得到的。DrawDib函数组的任何应用都要用到这个配置信息。能够通过调用DrawDibProfileDisplay函数来强制重新进行这些测试。
通常,取得和保存显示配置是一次性的事件。假如配置信息发现在这个系统中安装了另一个显示驱动时,DrawDib则重新进行测试。
图象再现
创建了DrawDib DC后,就能够用DrawDibDraw函数将DIB绘至屏幕。当在8位深度的显示适配器上显示真彩色图象时,DrawDib将自动地抖动图象。
DrawDib也透明地支持视频压缩器。当显示压缩位图时,可通过DrawDibGetBuffer函数得到包含了解压图象数据的缓冲区。假如位图是未压缩的,则DrawDibGetBuffer返回NULL。在应用程式中应自己区分位图是否压缩。
可用DrawDibUpdate宏来刷新一幅图象的整体或一部分的显示。
图象序列
当DrawDibDraw函数同DrawDibBegin函数一起运用时,能够显示相同尺寸和格式的位图序列。DrawDib通过DrawDibBegin准备绘图的DrawDib DC来提高DrawDibDraw的效率。假如,应用程式没有调用DrawDibBegin,那么DrawDibDraw会在绘图前隐含地执行DrawDibBegin。
DrawDibBegin给DrawDibDraw提供了DrawDib的DC,DC的句柄,BITMAPINFOHEADER结构的地址和源矩形及目的矩形的尺寸。当要显示一个位图序列时,DrawDibDraw要检查序列中的每幅图象的这些值。假如DrawDibDraw检测到这些值有任何变化,他将隐含地再次调用DrawDibBegin来调整DrawDib DC的配置。
当调用完DrawDibBegin后,就能够指定一个或多个适当的标志来调用DrawDibDraw绘制图象序列。只要DC句柄未改变,就可指定DDF_SAME_HDC标志;下列参数未改变,就可指定DDF_SAME_DRAW标志:BITMAPINFOHEADER结构的地址和源矩形及目的矩形的尺寸。
能够通过在DrawDibEnd后跟另一个DrawDibBegin调用来更新前一个DrawDibBegin配置的标志。DrawDibEnd清除了当前的DrawDib DC的标志和配置。后续的调用DrawDibBegin将重新初始化DrawDib DC,并重新配置适当的标志和配置。然而,只要至少改变了以下任一个当前的标志配置:BITMAPINFOHEADER结构的地址或是源矩形或目的矩形的尺寸,也可不使用DrawDibEnd而直接调用DrawDibBegin来更新一个DrawDib DC。
通过使用DrawDibStart和DrawDibStop函数,能够提高使用压缩图象的数据流操作(如回放一个视频片)的DrawDibDraw的效率。DrawDibStart通过发送一个消息告诉视频管理器(VCM)准备DrawDib DC来接受一个图象流。当流结束时,DrawDibStop发送一个消息给VCM来指示他释放申请的资源。
需要注意的是,在应用程式中必须确定源矩形和目的矩形的宽度和高度;然而却并无需确定这些矩形的起点。应用程式能够重新DrawDibDraw中的起点坐标来使用图象的不同部分或更新显示的不同部分。
DrawDib函数组需要响应两条调色板消息:WM_QUERYNEWPALETTE和WM_PALETTECHANGED。假如应用程式未注意到调色板,就需要对这些消息都增加一个各自的消息处理。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: 在桌面上画图
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash