用VisualC显示位图的原理与方法

上传人:文*** 文档编号:63040177 上传时间:2022-03-16 格式:DOCX 页数:13 大小:22.22KB
收藏 版权申诉 举报 下载
用VisualC显示位图的原理与方法_第1页
第1页 / 共13页
用VisualC显示位图的原理与方法_第2页
第2页 / 共13页
用VisualC显示位图的原理与方法_第3页
第3页 / 共13页
资源描述:

《用VisualC显示位图的原理与方法》由会员分享,可在线阅读,更多相关《用VisualC显示位图的原理与方法(13页珍藏版)》请在装配图网上搜索。

1、文档供参考,可复制、编制,期待您的好评与关注! 一、介绍在VC+环境下显示位图并不是什么新技术,但本文仍然在此“老调重弹”的原因是:(1)这一技术十分重要,它是图像编程的基础,掌握不了这些基本原理也就很难独立开发出符合实际需要的应用程序;(2)许多关于VC+编程的资料都提供了显示位图(Bitmap)的实例,但遗憾的是,由于侧重点的不同使得有关调色板、设备上下文(DC)以及图形设备接口(GDI)等与位图密切相关的知识要么是很少提到,要么就是很不全面、一代而过,或者部分内容被放到了别处,显得支离破碎。这使得许多读者在模仿这些例子“克隆”出自己的应用程序后,仍感到有许多不解之处存在;(3)为了显示位

2、图,Windows及MFC提供了一些类和函数供我们利用,熟悉它们的作用对我们编程很有帮助。二、基本概念与原理调色板:调色板的概念必须首先介绍,它在除24位真彩色显示系统的其它系统中都要用到。尽管多媒体技术的发展令计算机所能显示的色彩越来越绚丽缤纷,但实际上,自然界无限种类的颜色目前仍无法在计算机上完全表达出来。现在最高级的所谓24位“真彩色”的显示系统也只能显示既16,777,216种颜色,当然,这已经完全够用了,因为人眼还没有能力区分真彩色系统表现出的颜色与大自然中实际颜色的区别。在这种系统中,每一个像素的值都用红(R)、绿(G)、蓝(B)三色,每色8位共24位来表示,“24位”显示系统的名

3、字也由此而来,所以,其像素值就是要显示的颜色值,显然,此时只需要直接显示就行了,而不需要调色板。但对于目前许多4位(16色)或8位(256色)显示系统来说,其像素值与颜色值并不一一对应,此时,调色板技术被派上了用场。调色板的定义如下:它是在16色或256色显示系统中,由图像中出现最频繁的16或256种颜色组成的颜色表。它依靠有限种颜色通过组合来实现其它颜色。若某幅图像是使用调色板的话,那它的像素值就表示颜色在调色板查找表中的索引号,而不是颜色值。VC+的MFC为调色板定义了相应的类CPalette,封装了对调色板操作的一系列函数。位图:有了调色板的概念,现在我们就可以切入正题、介绍位图了。我们

4、在使用计算机时要接触到大量的位图,它是指那些由一行行、一列列的像素点所组成的一个二维矩形像素点矩阵,这个矩阵存储了图像信息,组成了一幅幅的图片。可以毫不夸张地说,正是有了大量位图的存在,才使得当今的程序界面变得如此丰富多彩。Windows位图有两种:DDB和DIB。前者依赖于设备(Device Dependent Bitmap),与MFC6.0中的CBitmap类(CGdiObject类的子类)相对应,它们在内存中的结构和位置依赖于管理它们的设备驱动程序。DDB不包含颜色信息,显示图像依赖于系统硬件,这使得它的优点是显示简单、迅速,但也正是由于这一特性,使得此种位图既不能通过磁盘也不能通过Mo

5、dem将其传到其它计算机中实现共享,因此它的应用范围也就越来越小了。与DDB相比,设备无关位图DIB(Device Independent Bitmap)是一种外部图像格式,它克服了DDB的缺点,可以从一台主机通过网络等媒介传到其它主机上实现文件共享。DIB之所以独立于设备,是因为它包含了一个名为RGBQUAD的结构,描述了DIB位图对应的逻辑调色板的颜色表,其像素值是该调色板中的颜色索引值,因此,当一幅DIB传输到另一台计算机上时,该计算机显示它时只需根据这幅DIB的颜色表“按图索骥”就行了,而不必关心是否与当前的硬件配置相吻合。图1一幅DIB图像计算机生成的所有以.bmp为后缀结尾的文件都

6、代表DIB,比如我们在Windows的“画图”中生成的图像(见图1),DIB格式有单色、16色、256色以及24位真彩色等多种。其定义如图2所示:位图文件头信息(BITMAPFILEHEADER):描述文件的类型、大小及格式位图信息标题(BITMAPINFOHEADER):包括信息标题主信息及调色板信息调色板数据:描述红、绿、蓝三色分量所占比例。实际图像数据:数据可以是压缩或不压缩的图2DIB文件结构以上几部分在Windows.h当中都有相应的定义,有关DIB文件结构的更详细定义读者可参考有关资料。遗憾的是,MFC中没有专门处理DIB位图的类,因此,要想利用VC+对DIB进行操作,那就要么直接

7、调用Win32 SDK的API函数,要么就只能自己定义专门处理DIB的类。而由于相关的API函数也实在有限,所以一般处理位图的应用程序都采用了后一种方法。DC:DC(Device Context)被称作设备上下文,Windows的设备无关性使得我们无法直接对硬件进行操作,因此必须借助它来连接应用程序和设备驱动程序,以便实现诸如访问内存等功能。DC的作用如图3所示:应用程序DC设备驱动程序显示数据显示器、打印机通过连接控制显示在图3DC的作用具体说来,设备上下文详尽的指定了诸如显示器、打印机、绘图机及Modem等物理设备的特征,是一个保存绘图界面属性的数据结构。此外,Windows中还有一些特殊

8、的DC,如代表位图的设备上下文Memory DC,只有通过它,应用程序才能在位图中绘图。对应于DC,VC+设计了相应的设备环境类CDC,包括几个派生类,其相互关系及每个派生类的作用见图4所示。GDI:最后,有关GDI的概念也作一下介绍。GDI指Windows的图形设备接口(Graphics Device Interface),是Windows用来管理图像操作的一个与设备无关的模块,应用程序通过GDI向输出设备绘图。上面介绍的DC就属于GDI所有,其它实现位图必不可少的工具,如画笔、刷子、调色板等也都要用该模块来管理,Windows中许多有关图像操作的API函数也是由GDI来提供的。MFC中的C

9、GdiObject类封装了GDI中的部分实体(见图5),但请注意,被封装的实体只是一部分,而并不像CDC类与DC之间有一一对应关系。CDC类CClintDC类:管理成员函数在客户区内的绘图操作。CWindowDC类:管理成员函数在整个窗口区域内的绘图操作。CPaintDC类:响应WM_PAINT消息,重画某一区域,保证图形完整。图4CDC类及其派生类CGdiObject类CBitmap类:位图类,位图是表示图像的最常用工具。CBrush类:刷子类,刷子多用于添充区域。CFont类:字体类,包括特定字体及特定大小写。图5CGdiObject类及其派生类CPalette类:调色板类,使得输出设备的

10、颜色能力得以从分利用。CPen类:笔类,笔是用于绘制直线和绘制边界的工具。CRgn类:区域类,包括多边形、椭圆等。CMetafileDC类:代表图元文件DC。以上两个类共同实现了GDI的功能。有了调色板、位图、DC、GDI等几个基本概念,下面我们就可以对实现显示位图的步骤进行描述了。三、实现方法显示DDB的方法:图6给出了用VC+实现显示DDB位图的一般方法。其中上排文字表示实现步骤,下排括号中的文字表示实现这一步骤的具体模块或函数。加入位图资源定义CBitmap类的对象调用LoadBitmap()装入位图(资源编辑器)(视图类或其它类)(类的初始化函数中)创建与显示DC相兼容的内存DC将要选

11、择的位图选入内存DC(视图类的OnDraw()函数中)(SelectObject()函数)从内存DC拷贝至显示DC对位图进行放大或压缩等特殊操作显示(BitBlt()函数)(StretchBlt函数)(显示器)图6显示DDB的一般方法下文给出一段具体的程序代码,与图6相对应:CBitmap mybitmap/定义CBitmap类的对象CDCmydcMemory;/定义CDC类的对象mybitmap.LoadBitmap(IDB_MYBITMAP);/装入ID号为IDB_MYBITMAP的位图mydcMemory.CreateCompatibleDC(pDC);/创建与显示DC相兼容的内存DCm

12、ydcMemory.SelectObject(&mybitmap);/将选定的位图选入内存DCpDC-BitBlt(10,10,50,50,&mydeMemory,0,0, SRCCOPY);/从内存DC向显示DC复制。10,10/表示显示位置为窗口左上角,向右向/下各偏置10;50,50表示位图大小,/单位为像素;0,0指出源位图的起始/位置;SRCCOPY表示直接将源位图/拷贝到目的位图,不作修改。PDC-StretchBlt(10,10,50,50,&mydeMemory, 0,0,100,100,SRCCOPY);/扩大或缩小位图。其中100,100就表/示将原来50*50大小的位图扩

13、大为/100*100,其它参数与BitBlt()中的相同。BitBlt()函数通过最后一个参数来表明对位图的颜色操作方式,如上例中的SRCCOPY意思是直接拷贝,其它还有BLACKNESS(变为黑色)、WHITENESS(变为白色)、DESTINVERT(翻转目的位图)等多种方式,有兴趣的读者可参考相关书籍。显示DIB的方法:DIB涉及到了调色板,所以显示DIB的步骤当中必须包含生成、设置以及实现调色板的内容(24位真彩色系统除外)。大体上来说,显示DIB有两种方法:方法一直接利用API函数。法1:可以借助DDB来显示DIB,此时需要将DIB“转换”成DDB,因此就要先用CreateDIBit

14、map()创建一个DDB,然后调用SetDIBitmap()将DIB拷贝到DDB当中,再将DDB选进内存DC,最后调用BitBlt()函数在显示屏上显示。其总体思路与显示DDB的方法很类似。法2:还有一种方法是将位图文件直接读入内存,这时需要获得位图文件结构中的有关位图信息及显示数据(文件结构见图2)。读入这些信息以后,如果是24位真彩色位图,就可以调用StretchDIBits()函数直接显示DIB,而不必借助于DDB。而如果位图不是24位真彩色的,那还要先处理颜色表,根据颜色表来建立位图显示调色板,再进行显示。加入位图资源直接显示(24位真彩色位图)(StretchDIBits()函数)读

15、入位图文件的格式信息构造逻辑调色板(其它位图)创建调色板(CreatePalette()函数)设置调色板显示调色板显示位图SelectPalette()RealizePalette()(BitBlt()、StretchDIBits())图7显示DIB的API方法方法一中法2的实现步骤如图7所示。方法二定制DIB类,用面向对象编程的方法对DIB进行处理。这是最复杂也是最简单的一种办法,复杂是因为必须要建立一套完整的DIB处理 函数库,简单是因为采用面向对象的方法在对位图进行操作时显得简单。进一步探讨定制DIB类不是本文的目的,许多文献中的程序实例都实现了这样的类,读者只要弄清楚了上文中描述的概念

16、和原理,今后碰到类似的内容时就不会困惑了。四、实例这部分给出了一个将位图贴在按钮上的例子,因为MFC的CBitmapButton类的存在,将指定的位图与按钮联系了起来,并且封装了具体的实现代码,因此使得我们实际要做的工作很少。我们提出这样一个例子的目的是为了说明位图的一种应用。步骤1在AppWizard下生成一个基于对话框的工程(Dialog Based Project),命名为”位图按钮”,其它全部选用默认选项。步骤2生成位图资源。对于一个按钮,要生成的位图资源有两个,以便在按钮被选中以及被放开时显示不同的状态。因此,首先在“画图”程序中打开一幅自己喜欢的位图(.bmp)文件,由于是用贴在按

17、钮上,所以它不必要太大(如图8所示),存在BmpButton工程下的子目录res下,命名为buttonUP.bmp,作为按钮弹起时的状态;图8一幅位图图9反色后的效果对位图进行适当处理(如“图象”菜单下的“反色”算法,见图9),以buttonDN.bmp为名字存在同一目录下,作为按钮弹被按下时的状态。步骤3引入资源文件。在VC+的ResourceView当中选择标题Dialog Resource并单击右键,在弹出菜单中选择import.项,然后分别从res目录下引入步骤二中得到的两个位图。分别将其ID号改为“YAHOOU”和“YAHOOD”,后者对应反色后的位图。注意,我们这里是通过名字来标识

18、资源,所以上述两个ID号一定要加引号。步骤4在对话框中加入一个按钮(Button)控件,ID号改为IDC_YAHOO, Caption改为Yahoo,然后还必须将按钮的Styles属性(Properties)中的“Owner Draw”项选中。步骤5在位图按钮Dlg.h的类声明部分中加入以下代码:public:CBitmapButton m_bmpButton;/生成CBitmapButton类的一个对象;步骤6在位图按钮Dlg.cpp的OnInitDialog()函数中加入以下代码:VERIFY(m_bmpButton.AutoLoad(IDC_YAHOO, this);/调用AutoLoad()函数自动将按钮与资源联系/起来;为了在对话框生成时完成这一工作,/这句代码加在了OnInitDialog()当中。.步骤7编译,运行。结果如图10和图11所示:图10程序运行结果图11按钮被按下去时的情形这个按钮除了将“朴素”的外表改头换面以外,与普通按钮一样,可以实现同样的功能。以上程序在Visual C+6.0中调试通过。13 / 13

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!