1、本 科 毕 业 论 文TIF/TIFF 图像合成方法及其在传真编辑系统中的实现Implemention On the Fax Editor System Based On TIF/TIFF Images Synthesis姓 名:学 号:学 院:软件学院系:软件工程专 业:软件工程年 级:校外指导老师: 校内指导老师: 年 月摘 要采用 Visual C+ 6.0 实现 TIF/TIFF 图像合成,主要应用于办公自动化中传真文件的图形化编辑、加注、签字盖章等。论文主要由三部分组成:第一部分描述了项目研究背景,回顾了相关研究状况,介绍图像基础知识,并确认了项目所要达到的目标;第二部分详细介绍了图
2、像编程的方法和步骤,为系统整体框架准备了具体的模块,是论文的重点章节,建立面向对象位图类库,详细分析了技术难点,位图编程结合 GDIPlus SDK 图像编程成功解决了图像格式的转换;第三部分以具体模块为基础,论述了系统概要设计、详细设计和编写了软件测试报告,文章最后对论文做出了总结和展望。软件成功解决了传真文件的图形化编辑,采用了独特的解决方案,思路清晰,操作方便快捷,值得借鉴。关键词:图像签名;图像合成;TIF/TIFF 图像格式。AbstractUsing Visual C + + 6.0 implements TIF / TIFF image synthesis, mainly use
3、d in office automation for the fax file graphical edited, endorsed, signed ,sealed and so on. The thesis is mainly composed of three parts. The first part describes the research background of the project, review the status of related research, introduce basic knowledge of image and confirm the goals
4、 of the project. The second part of a detailed introduction of the image programming method and steps prepare an overall framework for system specific modules, are the focus of thesis chapters, set up a bitmap object-oriented class library, a detailed analysis of technical problems, combined with bi
5、tmap GDIPlus SDK graphics programming successfully resolved image format conversion. The third parts to a specific module for the foundation, discusses the summary of design , detailed design and the preparation of a software test reports, the end of the paper made a summary and outlook. The softwar
6、e successfully resolved fax graphical editing, the use of a unique solution, clearly, easily to operate faster, is worth learning from.Key Words:Image Signature;Image Synthesis ;TIF/TIFF Image Format.目 录第 1 章 引言 11.1. 研究背景 11.2. 研究目标 11.3. 研究现状 21.3.1. EastFax 智能传真软件 21.3.2. CxImage 类库 21.4. 相关知识介绍
7、31.4.1. TIF/TIFF 格式图像文件介绍 31.4.2. BMP/DIB/DDB 位图的介绍 .51.5. 本文的主要研究工作 51.6. 本文结构 5第 2 章 位图编程 72.1. 面向对象的位图编程 72.1.1. 定义 DIB 处理函数集 .72.1.2. 定义 CDIB 类 92.1.3. 图像缩放功能 102.1.4. 图像旋转功能 112.1.5. 图像合成功能 122.1.6. 图像签名功能 162.2. GDIPlus SDK 图像编程 .182.2.1. GDIPlus SDK 介绍 182.2.2. TIFF 格式图像转换为 BMP 位图 192.2.3. BM
8、P 位图转换为 TIFF 格式图像 19第 3 章 传真编辑系统的概要设计与详细设计 203.1. 概要设计 203.1.1. 系统说明 203.1.2. 模块说明 213.1.3. 界面约定 223.2. 详细设计 233.2.1. 类 TIFFToBMP 模块 .233.2.2. 类 BMPToTIFF 模块 .233.2.3. 类 CDIB 模块 243.2.4. BMP 图像变换模块与 BMP 图像签名、图像合成模块 243.2.5. ViewDIB 模块 .243.2.6. 图像界面模块 25第 4 章 传真编辑系统的测试 264.1. 单元测试 264.2. 集成测试 264.3.
9、 系统测试 27第 5 章 总结与展望 285.1. 总结 285.2. 展望 28致谢参考文献ContentsChapter 1 Introduction 11.1. Research Background 11.2. Research Objecive 11.3. The Related Items .21.3.1. EastFax Intelligent Fax Software .21.3.2. CxImage Class Library.21.4. The Related Knowledge Introduction.31.4.1. TIF/TIFF Image File Intro
10、duction31.4.2. BMP/DIB/DDB Bitmap Introduction 51.5. Primary Coverage.51.6. Structure5Chapter 2 DIB Programming72.1. Bitmap Object-Oriented Programming .72.1.1. The Definition Of DIB API72.1.2. The Definition Of CDIB Class.92.1.3. Image Zooming 102.1.4. Image Rotating .112.1.5. Image Synthesis Proce
11、ss 122.1.6. Image Signture Process 162.2. GDIPlus SDK Graphics Programming 182.2.1. GDIPlus SDK Introduction 182.2.2. TIFF Image File Converted To BMP Image File.192.2.3. BMP Image File Converted To TIFF Image File.19Chapter 3 FaxEditor System Preliminary And Detailed Design .203.1. Preliminary Desi
12、gn .203.1.1. System Introduction .203.1.2. Module Introduction.213.1.3. Interface Agreement.223.2. Detailed Design233.2.1. TIFFToBMP Module .233.2.2. BMPToTIFF Module .233.2.3. CDIB Module.243.2.4. BMP Changing 、BMP Signture And Synthesis243.2.5. ViewDIB Module.243.2.6. UI Module 25Chapter 4 FaxEdit
13、or System Testing .264.1. Unit Testing .264.2. Integration Testing .264.3. System Testing 27Chapter 5 Summary And Prospect.285.1. Summary .285.2. Prospect .28AcknowledgmentsReferences第 1 章 引言1第 1 章 引言1.1. 研究背景IP PBX 基于 IP 的电话交换机系统实现计算机网与电话交换机的功能合一,将会在二十一世纪的通信业中起着重要的作用。IP PBX 网络系统内各电话终端采用 IP 方式进行数据通信
14、,不仅能进行通话,还能实现文本、数据、图像的传输,将电话网和计算机网统一成一个整体,实现局域网内的电子办公。本论文课题为“TIF/TIFF 图像合成方法及其在传真编辑系统中的实现” 。传真在传输图像之前要先把图像转化为 TIF./TIFF 格式化。TIF/TIFF 是可拓展标签的图像格式,多用于扫描图像文件格式,在 IP PBX 中是作为邮件传真的图像格式进行传输的。由于 TIF/TIFF 格式的图像文件索引图像数据部分,是根据图像文件目录(Image File Directory 简称 IFD)中的目录入口(Directory Entry 简称 DE)来确定,其中目录入口中的标签(Tag )
15、是可拓展的,并且一个图像文件可以存储多帧,这就说明没有统一的图像格式标准,因而在进行程序设计之前确定一种符合传真传输图像的格式显得异常重要。厦门亿群软件技术有限公司开发的 BizFax 软件产品中已经指定了一种 TIF/TIFF 图像传真格式标准,笔者的毕业设计根据该标准进行程序开发。1.2. 研究目标采用 Visual C+ 6.0 实现 TIF/TIFF 图像合成,主要应用于办公自动化中传真文件的图形化编辑、加注、签字盖章等。其中包括 TIF/TIFF 文件的读取、转换和存储,图像读取后能支持预览显示、放大、缩小,合成处理后最终保存为指定的 TIF/TIFF 格式;还包括图像合成算法的实现
16、,支持文字、图片合成。具体功能列举如下。(1) TIF/TIFF 文件的读取。读取的文件来源是已经经过特殊处理的TIF/TIFF 文件(公司虚拟打印机处理过的图像文件) 。(2) 支持图像转换。图像转换是指 TIF/TIFF 转换为 BMP 格式位图,建立在位图基础上的图像显示、放大、缩小、旋转、签字和合成处理后,最终把 BMP格式位图转换成指定的 TIF/TIFF 格式图像。(3) 支持多帧图像。支持多帧图像的打开和存储功能。TIF/TIFF 图像合成方法及其在传真编辑系统中的实现2(4) 实现图像合成。其中包括图像指定位置插入文字(鼠标指定位置) ,图像之间的合成。合成是透明合成,不是图像
17、覆盖。图像合成依赖于图像合成算法。1.3. 研究现状1.3.1. EastFax 智能传真软件国产软件在世界的又一奇迹,目前公认最优秀的传真软件,功能强大,操作简单,界面精美!全面开放语音提示、手动接收等功能。EastFax 由 Forwave复园科技开发,它带来全新的传真理念,无需改变原有的传真线路,只需一套EastFax 智能传真服务器(MODEM 或传真卡) ,公司里所有的员工都可以在自己的电脑前收发传真,每个人都有一个传真分机号,接收的传真直接分发到个人电脑,既可以编辑、加印章签名,也可自由地转发给其他人;所有能打印的文档都可以发送,智能排队,批量群发!强大的传真分类管理、检索功能,几
18、秒钟就能找出几年前的某份传真!传真与邮件、短信的结合,随时随地都可以收发传真,还可以实现与分支机构、老客户的免费传真!不同的版本适用于各类大、中、小型企业。1.3.2. CxImage 类库CxImage 是一个开源的 C+类库,它能打开,存储和显示各种格式图像,支持 TIF/TIFF、JPEG 、PNG、BMP 等格式的图像文件。基于 CxImage 开发的DEMO 程序类似 Photoshop 软件,功能强大,处理图像签名、合成及其完美。图 1-1 列出 CxImage 类库的继承机制。图 1-1 CxImage 组织结构第 1 章 引言31.4. 相关知识介绍1.4.1. TIF/TIF
19、F 格式图像文件介绍TIF/TIFF 图像由四部分组成:(1) 图像文件头(Image File Header 简称 IFH) 。如图 1-2 所示,IFH 数据结构包含 3 个成员共计 8 个字节,Byte order 成员可能是“MM”(0x4d4d)或“II”(0x4949), “0x4d4d”表示该 TIFF 图是摩托罗拉整数格式“0x4949”表示该图是 Intel 整数格式;Version 成员总是包含十进制“42(0x2a)” ,它用于进一步校验该文件是否为 TIF 格式, “42”这个数并不是一般人想象中的那样认为是 TIF软件的版本,实际上, “42”这个数大概永远不会变化;
20、第三个成员是 IFD(接下来要说的第二个数据结构)相对文件开始处的偏移量。 图 1-2 图像文件头描述(2) 图像文件目录(Image File Directory 简称 IFD) 。如图 1-3 所示,IFD 是TIF 图中最重要的数据结构,它包含了一个 TIF 文件中最重要的信息,一个 TIF图可能有多个 IFD,这说明文件中有多个图像,每个 IFD 标识 1 个图像的基本属性。 IFD 结构中包含了三类成员,Directory Entry Count 指出该结构里面有多少个目录入口;接下来就是 N 个线性排列的 DE 序列,数量不定(这就是为什么称 TIF 格式文件为可扩充标记的文件,甚
21、至用户可以添加自定义的标记属性) ,TIF/TIFF 图像合成方法及其在传真编辑系统中的实现4每个 DE 标识了图像的某一个属性;最后就是一个偏移量, 标识下一个文件目录相对于文件开始处的位置,当然,如果该 TIF 文件只包含了一幅图像,那么就只有一个 IFD,显然,这个偏移量就等于 0。图 1-3 图像文件目录和目录入口结构描述(3) 目录入口(Directory Entry 简称 DE) 。如图 1-3 所示,简单的说,一个DE 就是一幅图像的某一个属性。例如图像的大小、分辨率、是否压缩、像素的行列数、一个像素由几位 表示(1 位代表黑白两色,8 位代表 256 色等等)等。其中:tag
22、成员是该属性的编号,在图像文件目录中,它是按照升序排列的。我们可以通过读这些编号,然后到 TIF 格式官方白皮书中(TIFF Revision 6.0 )查找相应的含义。属性是用数据来表示的,那么 type 就是代表着该数据的类型,TIF 官方指定的有 5 种数据类型。 type=1 就是 BYTE 类型(8 位无标记整数) 、type=2 是 ASCII 类型(7 位 ASCII 码加 1 位二进制 0) 、type=3 是 SHORT 类型(16 位无标记整数) 、type=4 是 LONG 类型(32 位无标记整数) 、type=5 是RATIONAL 类型(2 个 LONG,第一个是分
23、子,第二个是分母) 。length 成员是数据的数量而不是数据类型的长度。 第 4 个成员 valueOffset 很重要,它是 tag第 1 章 引言5标识的属性代表的变量值相对文件开始处的偏移量。如果变量值占用的空间小于 4 个字节,那么该值就存放在 valueOffset 中即可,没必要再另外指向一个地方了。DE 中的 tag 是可以拓展的,也是编写符合传真图像格式的 TIF/TIFF 图像文件的难点所在,因此要对 tag 值深入研究,才能开展进一步的工作。(4) 图像数据。根据存储像素的位数不同进行存储,图像数据可以根据 DE索引得到。1.4.2. BMP/DIB/DDB 位图的介绍B
24、MP(Bitmap-File)图形文件是 Windows 采用的图形文件格式,在 Windows环境下运行的所有图象处理软件都支持 BMP 图像文件格式。 Windows 系统内部各图像绘制操作都是以 BMP 为基础的。Windows 3.0 以前的 BMP 文件格式与显示设备有关,因此把这种 BMP 图像文件格式称为设备相关位图 DDB(device-dependent bitmap)文件格式。Windows 3.0 以后的 BMP 图像文件与显示设备无关,因此把这种 BMP 图像文件格式称为设备无关位图 DIB(device-independent bitmap)格式(注:Windows
25、3.0 以后,在系统中仍然存在 DDB 位图,像 BitBlt()这种函数就是基于 DDB 位图的,只不过如果你想将图像以 BMP 格式保存到磁盘文件中时,微软极力推荐你以 DIB 格式保存) ,目的是为了让 Windows 能够在任何类型的显示设备上显示所存储的图像。BMP 位图文件默认的文件扩展名是 BMP 或者 bmp(有时它也会以.DIB 或.RLE 作扩展名) 。由于 BMP、DIB、DDB 图像格式比较让人所熟悉,在这里就不做具体介绍。1.5. 本文的主要研究工作(1) 熟悉 TIFF 传真文件格式,深入了解位图编程,实现传真编辑系统图像处理部分的程序。(2) 了解 MFC 界面编
26、程,掌握 VC 开发工具,实现传真编辑系统界面。(3) 完成系统集成,并作测试。1.6. 本文结构本文可以分为五章,结构如下:第一章主要对传真编辑系统研究背景和现状进行介绍。TIF/TIFF 图像合成方法及其在传真编辑系统中的实现6第二章是本文重要的一章,详细阐述了位图编程中实现的几个功能模块,图像格式的转换,图像变换中的图像缩放、图像旋转、图像合成和图像签名。第三章主要是实现传真编辑系统的概要设计和详细设计,针对系统的总体框架进行详细设计,包括模块描述、功能、输入输出项和存储分配。第四章主要是对传真编辑系统做出测试,并记录和分析测试结果。第五章主要是对全文的总结和对传真编辑系统以后所考虑的工
27、作的一个展望。第 2 章 位图编程7第 2 章 位图编程2.1. 面向对象的位图编程2.1.1. 定义 DIB 处理函数集(1) Win32 SDK 中的 DIB API 函数:由于 DIB 位图能独立地保存固有的图像信息,能在不同的系统中重显图像,因此成为了 Windows 环境中的基本图像格式。MFC 中没有设计处理 DIB 位图的类,编程时直接调用 Win32 SDK 的有关API 函数,无法按照 “面向对象”编程思想组织程序。Win32 SDK 只提供了少数的 DIB API 函数,在进行图像编程时远远不够,因此定义一套完整的 DIB 处理函数非常必要。表 2-1 列出了 Win32
28、SDK 中的DIB API 函数,这是建立 DIB 处理函数集的基础,在这里有必要说明一下。表 2-1:Win32 SDK 中的 DIB API 函数函 数 功 能GetDIBits 从 DDB 中获取位图的图像位,用于将 DDB 转换为DIBSetDIBits 设置 DIB 的图像位,用于将 DIB 转换为 DDBCreateDIBitmap 用指定的 DIB 来创建 DDB,并用 DIB 信息初始化图像位SetDIBitsToDevice 直接将 DIB 位图的图像位输出到设备,用于显示 DIBStretchDIBits 将 DIB 位图映射输出到设备的一个矩形区域,位图可能被缩放Crea
29、teDIBPatternBrush 用 DIB 位图创建模式画刷CreateDIBSection 创建一个可直接写入的 DIBGetDIBColorTable 获取 DIB 的颜色表SetDIBColorTable 设置 DIB 的颜色表(2) 定义 DIB 处理函数集:以 Win32 SDK API 函数为基础,建立 DIB 处理函数集,为了使用方便,将函数的声明及相关的常量、宏、数据类型的定义放在文件 DIBAPI.H 中,而将所有函数的代码放在文件 DIBAPI.CPP 中,并以静态库的方式放在 DIBLib files 中。如表 2-2 所示。TIF/TIFF 图像合成方法及其在传真编
30、辑系统中的实现8表 2-2 DIB 处理函数集函数类型 函 数 名 功 能CreateDIB 创建一个空的 DIBCreateDefaultDIB 用当前的系统调色板创建一个空的DIBDestoryDIB 释放 DIB 内存块LoadDIB 从 DIB 文件中装载 DIB 数据SaveDIB 将 DIB 存到文件中初始化函数ReadDIBFile 读 DIB 文件到内存中BytesPerLine 获取 DIB 每行说占的字节数DIBlockSize 获取 DIB 数据块的大小DIBHeight 获取 DIB 高度DIBWidth 获取 DIB 宽度DIBNumColors 获取 DIB 的颜色
31、数DIBBitCount 获取 DIB 图像颜色位数FindDIBBits 获取 DIB 数据块的地址指针属性函数PaletteSize 获取 DIB 的调色板中的颜色表项数PaintBitmap 显示 DDB显示函数PaintDIB 显示 DIBDIBToDIBSection 将 DIB 转换为 DIBSectionDIBSectionToDIB 将 DIBSection 转换为 DIB 数据块ConvertDIBFormat 修改 DIB 的格式BitmapToDIB 将 DDB 转换为 DIBChangeBitmapFormat 修改 DDB 的格式DIBToBitmap 将 DIB 转
32、换为 DDB操作函数ChangeDIBFormat 基于当前系统调色板修改 DIB 的格式CreateDIBPalette 创建 DIB 调色板调色板函数 DisplayPalette 显示调色板第 2 章 位图编程9函数类型 函 数 名 功 能CopyPalette 拷贝调色板GetSystemPalette 获取当前系统调色板PalEntriesOnDevice 获取设备的调色板表项数CreateIdentifyPalette 创建等同调色板调色板函数MapDIBColorsToPalette 按指定的调色板映射 DIB 的颜色CopyScreenToBitmap 将屏幕显示转换为一个 D
33、DBCopyWindowToBitmap 将指定的显示转换为一个 DDBCopyClientRectToBitmap将指定的窗口用户区的指定区域显示转换为一个 DDBCopyScreenToDIB 将屏幕显示转换一个 DIBCopyWindowToDIB 将指定的窗口显示转换为一个 DIB捕获函数CopyClientRectToDIB 将指定的窗口用户区的指定区域显示转换为一个 DIB2.1.2. 定义 CDIB 类(1) 直接继承至 MFC 的基类 CObject:精通 Visual C+图像编程中介绍了不直接继承 MFC 中的 CBitmap 类的原因,这里就不再详细介绍。但要指出的是,在
34、定义 CDIB 类的时候,并没有选择在类中支持序列化(或者成为串行化) ,因为在后期的编码中,TIF/TIFF 格式的图像可能是多帧图像,这就在打开和保存图像数据的时候显得棘手。(2) 数据封装:所谓的数据封装就是指,将类的成员数据隐藏在类中,类的内部能直接调用这些成员数据,而类的外部通过类的成员函数来操作成员数据,达到了封装的效果,这是面向对象设计的重要优点,用来保护类中的数据不受外部的意外修改。CDIB 类中需要大量使用 Win32 API 函数,在数据封装时达到效果的同时,需要付出降低效率的代价。因此 CDIB 设计时,兼顾到效率问题,并没有达到成员数据的“纯粹”封装。(3) CDIB
35、类功能拓展:除了精通 Visual C+图像编程提供的 CDIB 类成员函数外,重写了 Read 方法,并增加了 ReadTIFF 函数,删除了串行化函数,TIF/TIFF 图像合成方法及其在传真编辑系统中的实现10将保存文件功能模块放到 CDocument 派生类中去处理。表 2-3 列出了增加的主要函数及其功能,修改的就不一一列出,详细代码请参照毕业设计程序代码。表 2-3 主要功能函数函 数 名 功 能Initialize 初始化文件名,设置图像帧数SetFrameCount 设置图像帧数GetFrameCount 获取图像帧数FindExtension 获取图像文件名的拓展名Mixtu
36、reDib 将当前窗口用户区指定的源图像透明合成于目标图像,合成时指定相应的透明色Read 判断所读取文件的格式,并调用相应的函数读取图像文件ReadTIFF 读取相应帧编号的 TIFF 格式图像文件,其中调用类TIFFToBMP,详细见下一章节对 GDI+的分析ReadDIB 读取 DIB 位图文件ChangeImageSize 重新设置图像的宽度和高度,达到缩放的效果MergeText 图像中加注文字,达到签名的效果2.1.3. 图像缩放功能(1) 图像缩放理论基础准备:变换表达式如公式 2-1 所示,当 、 大于 1urv的时候,图像放大;当 、 小于 1 而大于 0 的时候图像缩小。u
37、rv0,1,101uvrxyv公式 2-1公式 2-1 展开即得到公式 2-2。第 2 章 位图编程11uvxry公式 2-2(2) 基于位图图像缩放程序介绍:图像缩放有多种方法,本文只介绍一种直接改变图像大小的方法,这也是一种普通意义上的操作。为了保证不丢失和改变 DIB 的颜色信息,应该使用 DIBSECTION 来处理位图。首先应该从 DIB 创建 DIBSECTION,并针对 DIBSECTION 句柄调用 STRETCHBLT 函数,以实现位图的缩放,STRETCHBLT 函数是图像缩放最理想的方法,最后再将经缩放的DIBSECTION 的位数据复制到 DIB 中。具体的处理函数见程
38、序代码里的函数ChangeDIBSize。2.1.4. 图像旋转功能图像旋转理论知识准备:本文主要介绍图像进行逆时针 90 度、180 度和270 度旋转的方法,而 180 度和 270 度旋转又是多次调用旋转 90 度得到的结果。因此,在这里详细介绍 90 度。步骤 1:创建一个新 DIB,其颜色信息与源位图相同,注意新位图的宽、高分别为源位图的高和宽。步骤 2:根据位图的存储位大小,分别对 1 位、4 位、8 位和 24 位的位图进行旋转,即对 DIB 的每一像素进行公式 2-3-1 或者公式 2-3-2 所示的旋转变换。以上步骤应该注意以下几点:(1) DIB 的每个扫描行都必须填补到
39、4 字节的 DWORD 边界。通过检查DIB 的 BITMAPINFOHEADER 结构的 biWidth 域,以确定每行像素的总位数是否是 32 的倍数,如果不是,则必须考虑填补相应的位数。(2) DIB 位图的存储图像的顺序是从左到右、从下到上,在编写位图变换的算法时,应该考虑到这一特点所造成的影响。(3) 对于像素位数 1 的位图,其每个像素只占一位,每个字节存储八个像素TIF/TIFF 图像合成方法及其在传真编辑系统中的实现12点。字节最高位对应于最左边的像素。(4) 在没有压缩的像素位数为 4 的 DIB 位图中,每个字节存储两个像素,高四位对应于最左边的像素。(5) 在没有压缩的位
40、数为 8 的 DIB 位图中,每个字节存储一个像素。(6) 在像素位数为 24 的 DIB 位图中,每个像素占三个字节,从左到右的每一字节分别存蓝、绿、红的颜色值。主要的函数算法详见代码中的 RotateDIB,以上相关理论知识来自精通Visual C+图像编程 。进行 角度的旋转时,公式为cossin0,1,1ico001xyuv 公式 2-3当 = 时,即 90的时候,公式 2-3 简化为公式 2-3-1:2010,1,1xyuv公式 2-3-1即为公式 2-3-2 所示: xvyu公式 2-3-22.1.5. 图像合成功能图像合成算法主要在函数 MixtureDib(CDC* pDC,C
41、Rect rect,CDib* 第 2 章 位图编程13bkDib,CDib* foreDib)中体现。首先两个设备 DC 分别装入了前景图和背景图(如图 2-1,2-2 所示) ,然后另一个 DC 载入一幅二值图像(实际编程时,此二值图像直接在前景图 DC 中产生) ,作为 mask 图。将载入了前景图的设备环境m_dcFore 的背景色设为前景图的背景色(即为需要设置的透明色) ,将m_dcFore 拷贝到载入了 mask 图的设备环境 maskDc,得到一个新的 mask 图。新 mask 图就是前景图中背景色的地方转为白色,其他转为黑色的一幅图。在将前景图拷贝到 mask 图的过程中,
42、系统首先将前景图转换为单色图。当位图在彩色与单色之间转换时,系统会使用设备的背景色,与背景色相同的地方转换为白色,其他的转换为黑色。设 m_dcFore 的前景色为白色,背景色为黑色,m_dcFore 与 maskDc 做与运算,得到新的前景图(如图 2-3 所示) 。在做与运算时,系统先将单色图转换为彩色图,并用彩色图的前景色和背景色作为转换后的颜色。所以,新的前景图的背景色转变为黑色,其他的保持不变。设置背景图的前景色为黑色,背景色为白色,载入了背景图的设备环境m_dcBk 与 maskDc 做与运算,得到新的背景图。新的背景图的前景色转变为黑色,其他的保持不变。将新的背景图与新的前景图做
43、或运算(可以指定前景图合成到背景图的位置) ,得到的新图保持了背景图的背景,更融合前景图的前景,达到了我们想要的理想效果(如图 2-4 所示) 。图 2-1 前景图(foreDib)TIF/TIFF 图像合成方法及其在传真编辑系统中的实现14图 2-2 背景图(bkDib)图 2-3 消除背景色的前景图第 2 章 位图编程15图 2-4 最终合成的图像BOOL MixtureDib(CDC* pDC,CRect rect,CDib* bkDib,CDib* foreDib)CBitmap* poldBk = m_dcBk.SelectObject(m_pbmpBk); /选入背景图CBitma
44、p* poldFore = m_dcFore.SelectObject(m_pbmpFore);/选入前景图maskDc.CreateCompatibleDC(pDC); /创建与当前设备相兼容的设备maskBitmap.CreateBitmap(rect.Width(),rect.Height(),1,1,NULL );/创建一个单色图CBitmap* pOldMaskDCBitmap = maskDc.SelectObject( /选入单色图CBrush brush(RGB(255,255,255);CBrush * oldbrush;oldbrush=maskDc.SelectObjec
45、t(maskDc.FillRect(/ 取得要消除的背景色值,即设置透明色为蓝色,此处设置为“蓝色”COLORREF clrTrans= m_dcFore.GetPixel(2, 2);COLORREF crlSaveBk = m_dcFore.SetBkColor(clrTrans);TIF/TIFF 图像合成方法及其在传真编辑系统中的实现16/将前景图拷贝到 maskDcmaskDc.BitBlt(0,0,rect.Width(),rect.Height(), /前景图与 mask 做与运算m_dcFore.SetBkColor(RGB(0,0,0);m_dcFore.SetTextCol
46、or(RGB(255,255,255);m_dcFore.BitBlt(0,0,rect.Width(), rect.Height(),/得到图 2-3 所示/背景图与 mask 做与运算m_dcBk.SetBkColor(RGB(255,255,255);m_dcBk.SetTextColor(RGB(0,0,0);m_dcBk.BitBlt(0,0,rect.Width(),rect.Height(),m_dcBk.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),2.1.6. 图像签名功能(1) 橡皮筋矩形选择工具条:在进行图像加注
47、签名之前,先实现橡皮筋矩形选择工具条功能,该矩形选择工具条可以选择指定的图像区域,在完成图像加注签名以后,可以选择该区域进行拖曳。其实现方法和步骤可以描述如下:实现画橡皮筋矩形功能涉及两种基本技术,即如何获取变化的矩形区域位置,以及如何消除原来的矩形线。方法是直接响应消息WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP,来完成橡皮筋功能。当视图接收到 WM_LBUTTONDOWN 消息时,开始画橡皮筋矩形,跟踪 WM_MOUSEMOVE 消息就能获得矩形位置的变化,当接收到WM_LBUTTONUP 消息时,停止画橡皮筋矩形。第 2 章 位图编程17消除原来矩形线
48、的方法是,画矩形时,先调用 SetROP2 将光栅操作设置为R2_NOTXORPEN(异或)操作方式,这样在同一位置画相同的线,便可清楚线条。(2) 图像签名:直接由橡皮筋矩形选择功能确定矩形区域位置,然后利用CPen 进行编写文字,最终融合成一幅图像。效果如图 2-5 所示。图 2-5 签名效果图主要的程序如下:BOOL MergeText()/ 把文字合成到 DIB 图像if (! s.IsEmpty()CDC * pDibDC = m_pDib-BeginPaint(int nOldBkMode = pDibDC-SetBkMode(TRANSPARENT);/ 需要一个矩形区域确定位置
49、ClientToDib(rc);if (rc.bottom m_pDib-GetHeight()rc.bottom = m_pDib-GetHeight();if (rc.right m_pDib-GetWidth()rc.right = m_pDib-GetWidth();TIF/TIFF 图像合成方法及其在传真编辑系统中的实现18pDibDC-DrawText(s,pDibDC-SetBkMode(nOldBkMode);m_pDib-EndPaint();return TRUE;2.2. GDIPlus SDK 图像编程2.2.1. GDIPlus SDK 介绍(1) 目标:Microsoft Windows GDIPlus 是为 C/C+开发者提供的一个基于类的应用程序编程接口(API) 。它使得程序可以同时在视频显示器和打印机上使用图形和格式化文本。基于 Microsoft Win32 的应用程序不能直接访问图形硬件,而是通过 GDI+来协调设备驱动和程序动作的交互。 GDIPlus 同样支持 Microsoft Win64。(2) 适用范围:GDI 适用于所有