- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用VisualC显示位图的原理与方法
?一、介绍在VC++环境下显示位图并不是什么新技术,但本文仍然在此“老调重弹”的原因是:(1)这一技术十分重要,它是图像编程的基础,掌握不了这些基本原理也就很难独立开发出符合实际需要的应用程序;(2)许多关于VC++编程的资料都提供了显示位图(Bitmap)的实例,但遗憾的是,由于侧重点的不同使得有关调色板、设备上下文(DC)以及图形设备接口(GDI)等与位图密切相关的知识要么是很少提到,要么就是很不全面、一代而过,或者部分内容被放到了别处,显得支离破碎。这使得许多读者在模仿这些例子“克隆”出自己的应用程序后,仍感到有许多不解之处存在;(3)为了显示位图,Windows?及MFC提供了一些类和函数供我们利用,熟悉它们的作用对我们编程很有帮助。二、基本概念与原理调色板:调色板的概念必须首先介绍,它在除24位真彩色显示系统的其它系统中都要用到。尽管多媒体技术的发展令计算机所能显示的色彩越来越绚丽缤纷,但实际上,自然界无限种类的颜色目前仍无法在计算机上完全表达出来。现在最高级的所谓24位“真彩色”的显示系统也只能显示????既16,777,216种颜色,当然,这已经完全够用了,因为人眼还没有能力区分真彩色系统表现出的颜色与大自然中实际颜色的区别。在这种系统中,每一个像素的值都用红(R)、绿(G)、蓝(B)三色,每色8位共24位来表示,“24位”显示系统的名字也由此而来,所以,其像素值就是要显示的颜色值,显然,此时只需要直接显示就行了,而不需要调色板。但对于目前许多4位(16色)或8位(256色)显示系统来说,其像素值与颜色值并不一一对应,此时,调色板技术被派上了用场。调色板的定义如下:它是在16色或256色显示系统中,由图像中出现最频繁的16或256种颜色组成的颜色表。它依靠有限种颜色通过组合来实现其它颜色。若某幅图像是使用调色板的话,那它的像素值就表示颜色在调色板查找表中的索引号,而不是颜色值。VC++的MFC为调色板定义了相应的类CPalette,封装了对调色板操作的一系列函数。位图:有了调色板的概念,现在我们就可以切入正题、介绍位图了。我们在使用计算机时要接触到大量的位图,它是指那些由一行行、一列列的像素点所组成的一个二维矩形像素点矩阵,这个矩阵存储了图像信息,组成了一幅幅的图片。可以毫不夸张地说,正是有了大量位图的存在,才使得当今的程序界面变得如此丰富多彩。Windows位图有两种:DDB和DIB。前者依赖于设备(Device Dependent Bitmap),与MFC6.0中的CBitmap类(CGdiObject类的子类)相对应,它们在内存中的结构和位置依赖于管理它们的设备驱动程序。DDB不包含颜色信息,显示图像依赖于系统硬件,这使得它的优点是显示简单、迅速,但也正是由于这一特性,使得此种位图既不能通过磁盘也不能通过Modem将其传到其它计算机中实现共享,因此它的应用范围也就越来越小了。与DDB相比,设备无关位图DIB(Device Independent Bitmap)是一种外部图像格式,它克服了DDB的缺点,可以从一台主机通过网络等媒介传到其它主机上实现文件共享。DIB之所以独立于设备,是因为它包含了一个名为RGBQUAD的结构,描述了DIB位图对应的逻辑调色板的颜色表,其像素值是该调色板中的颜色索引值,因此,当一幅DIB传输到另一台计算机上时,该计算机显示它时只需根据这幅DIB的颜色表“按图索骥”就行了,而不必关心是否与当前的硬件配置相吻合。????图1?一幅DIB图像???????????计算机生成的所有以.bmp为后缀结尾的文件都代表DIB,比如我们在Windows的“画图”中生成的图像(见图1),DIB格式有单色、16色、256色以及24位真彩色等多种。其定义如图2所示:?位图文件头信息(BITMAPFILEHEADER):描述文件的类型、大小及格式?位图信息标题(BITMAPINFOHEADER):包括信息标题主信息及调色板信息???????????????调色板数据:描述红、绿、蓝三色分量所占比例。实际图像数据:数据可以是压缩或不压缩的图2??DIB文件结构????????以上几部分在Windows.h当中都有相应的定义,有关DIB文件结构的更详细定义读者可参考有关资料。遗憾的是,MFC中没有专门处理DIB位图的类,因此,要想利用VC++对DIB进行操作,那就要么直接调用Win32 SDK的API函数,要么就只能自己定义专门处理DIB的类。而由于相关的API函数也实在有限,所以一般处理位图的应用程序都采用了后一种方法。DC:DC(Device Context)被称作设备上下文,Windows的设备无关性使得我们无法直接对硬件进行操作,因此必须借助它来连接应用程序和设备驱动程序,以便实现诸如访问内存等功能
文档评论(0)