《实用软件开发》课程设计样例_第1页
《实用软件开发》课程设计样例_第2页
《实用软件开发》课程设计样例_第3页
《实用软件开发》课程设计样例_第4页
《实用软件开发》课程设计样例_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录 1 前言 0 1 1 开发背景 0 1 2 开发目的 0 2 系统相关的核心技术 0 2 1 MFC 介绍 0 2 2 GID 介绍 1 2 3 多线程介绍 2 2 4 图片格式介绍 6 3 需求分析与系统设计 7 3 1 需求分析 7 3 1 1 用户需求 7 3 1 2 系统需求分析 7 3 2 系统设计 9 3 2 1 系统流程设计 9 3 2 2 系统模块设计 9 4 系统实现 14 4 1 批处理模块 14 4 1 1 批量处理模块功能的实现 14 4 1 2 批处理模块核心技术 15 4 2 单文件处理模块 22 4 2 1 单文件处理模块功能实现 22 4 2 2 单文件处理模块核心技术 22 4 3 快速处理模块 24 4 3 1 快速处理模块的功能实现 24 4 3 2 快速处理模块的核心技术 24 课程设计 基于 MFC 的图片处理系统的设计与实现 0 1 前言 1 1 开发背景 随着网络的发展 多种图片在网上流传起来 在不同的场合下 对图片的要求是不相同的 这 就需要我们将这些图片进行转换以达到其要求 传统的方法可以利用数字图像处理来对图片进行变 化以达到目标 在进行数字图像图理以前必须要将所有的图像进行数字化 且如果装载一副图像 在 VC 下只支持 BMP 格式 进行数字化处理需要很深的数学功底 这样以来工作量可想而知 一般要 进行数字化图像处理需要用到 GDI 函数 在这种方式下进行图片处理需要以下步骤 读取图片信息 进行图片处理 保存处理后图片 显示处理后效果 传统的方法处理起图片来显得十分麻烦 而且 又由于 GDI 本身的一些限制 使得图片的读 写 显示工作本身就相当的麻烦 那么如果使用 GDI 进行编程则可以大大简化编程 GDI 在 GDI 上进行了扩展 它是基于 C 类的对象化的应用程 序编程接口 是微软在 Windows 2000 以后操作系统中提供的新接口 使用起来非常方便 大大缩 短了开发的时间 1 2 开发目的 由于网络的普及 许多图片信息都以电子的形式在网上流传 一些相关的领域需要大量的符合 标准的图片 如果用人工来处理这些图片就要借助一些工具 一张一张的进行处理 对于人力 物 力都是一种巨大的浪费 如果有图片处理系统 那么我们关心的只是符合处理结果的要求 所有的 输入 转换与输出都由计算机自动完成 那么就可以节约大量的时间 并且可以获得满意的效果 基于以上原因我开发了图片处理系统 2 系统相关的核心技术 该图片处理系统基于 MFC 采用 GDI 多线程等技术 并且以 Visual C 6 0 为开发工具 经过了需求分析 系统设计 代码编制 模块测试和系统实现这几个阶段 下面就对这几种技术和 方法做一个概述 2 1 MFC 介绍 MFC 是一个很大的 扩展了的 C 类层次结构 它能使开发 Windows 应用程序变得更加容易 与 传统上使用 C 语言直接访问 Windows API 相反 使用 MFC 和 C 的优点是 MFC 已经包含和压 缩了所有标准的 样板文件 代码 这些代码是所有用 C 编写的 Windows 程序所必需的 因此用 课程设计 基于 MFC 的图片处理系统的设计与实现 1 MFC 编写的程序要比用 C 语言编写的程序小得多 另外 MFC 所编写的程序的性能也毫无损失 必 要时 也可以直接调用标准 C 函数 因为 MFC 不修改也不隐藏 Windows 程序的基本结构 1 2 使用 MFC 的最大优点是它做了所有最难做的事 MFC 中包含了上成千上万行正确 优化和功 能强大的 Windows 代码 所调用的很多成员函数完成了自己可能很难完成的工作 从这点上将 M FC 极大地加快了程序开发速度 MFC 中的大部分类都是从基类 CObject 中继承下来的 该类包含有大部分 MFC 类所通用的数 据成员和成员函数 CWinApp 类是在建立应用程序是要用到的 并且任何程序中都只用一次 CWnd 类汇集了 Windows 中的所有通用特性 对话框和控制 CFrameWnd 类是从 CWnd 继承来的 并实 现了标准的框架应用程序 CDialog 可分别处理无模式和有模式两种类型的对话框 CView 是用于 让用户通过窗口来访问文档 最后 Windows 支持六种控制类型 静态文本框 可编辑文本框 按 钮 滚动条 列表框和组合框 一种扩展的列表框 一旦理解了这些 也就能更好的理解 MFC 了 MFC 中的其它类实现了其它特性 如内存管理 文档控制等 为了建立一个 MFC 应用程序 通常需要从这些类中继承新的类 在继承的类中 可以建立新的 成员函数 这能更适用自己的需要 在 MFC 中有六大仿真技术 它们分别是 3 1 MFC 程序初始化过程 2 TTI Runtime Type Information 运行时类型识别 3 Dynamic Creation 动态创建 4 Persistence 永久保存 5 Message Mapping 消息映射 6 Message Routing 消息传递 理解了以上技术后 就可以更加容易的进行 WINDOWS 应用程序的开发 2 2 GID GID 介绍介绍 GDI Graphics Device Interface Plus 是 Windows XP 中的一个子系统 它主要负责在显示 屏幕和打印设备输出有关信息是一组通过 C 类实现的应用程序编程接口 GDI 是以前版本 GDI 的 继承者 为了满足图形输出需要 开发人员可以使用 GDI GDI 对以前的 Windows 版本中 GDI 进 行了优化 并添加了许多新的功能 4 作为图形设备接口的 GDI 使得应用开发人员在输出屏幕和打印机信息的时候无需考虑具体显 示设备的细节 我们只需调用 GDI 库输出的类的一些方法即可完成图形操作 真正的绘图工作由 这些方法交给特定的设备驱动程序来完成 GDI 使得图形硬件和应用程序相互隔离从而使开发人员 编写设备无关的应用程序变得非常容易 一 GDI 主要提供的三类服务 5 一 二维矢量图形 GDI 提供了存储图形基元自身信息的类 或结构体 存储图形基元绘制方式信息的类以及实际 课程设计 基于 MFC 的图片处理系统的设计与实现 2 进行绘制的类 二 图像处理 大多数图片都难以划定为直线和曲线的集合 无法使用二维矢量图形方式进行处理 因此 GDI 为我们提供了 Bitmap Image 等类 它们可用于显示 操作和保存 BMP JPG GIF 等图像格式 三 文字显示 GDI 支持使用各种字体 字号和样式来显示文本 GDI 接口是基于函数的 而 GDI 是基于 C 类的对象化的应用程序编程接口 因此使用起来比 GDI 要方便 二 在 VC 中使用 GDI 所要做的配置 6 由于 VC 中并不自带 GDI 需要下载一个 GDI 的库函数 当下载好以后 里面会有一个 Includes 文件夹 一个 Lib 文件夹 还有一个 gdiplus dll 的动态链接库 然后开始进行配置 一 包含头文件 将 Includes 文件夹中的头文件 放到工程目录中去 在程序调试时会用到这些头文件的声明 二 添加链接库 GdiPlus lib 点击 工程 设置 link 在分类中选择 Input 在下面的 对象 库模块 中 输入 GdiPlus lib 在下面的 附加库路径 中添加这个链接库所在的路径即可 三 在 stdafx h 中引进 GDI 在 stdafx h 中添加以下代码以进行引进 GDI ifndef ULONG PTR define ULONG PTR unsigned long endif include GdiPlus h using namespace Gdiplus pragma comment lib gdiplus lib 四 GDI 使用前初始化 在程序的 App 类里 添加一个成员变量 ULONG PTR m gdiplusToken 在 App 的 InitInstance 函数里 在 INT PTR nResponse dlg DoModal 之前 添加下面的 语句 Gdiplus GdiplusStartup 在 INT PTR nResponse dlg DoModal 之后添加下面的语句 Gdiplus GdiplusShutdown m gdiplusToken 当做完以上工作以后就可以正确的使用 GDI 了 课程设计 基于 MFC 的图片处理系统的设计与实现 3 2 3 多线程介绍多线程介绍 多线程在 VC 程序设计中非常的重要 在 MFC 中线程分为两种 一种为 worker 工作者线程 一种为 UI 即用户界面线程 工作者线程一般用于后台的数据处理 而用户界面线程用来响应用 户的操作 以下就两种线程分别做介绍 7 一 工作者线程 工作者线程通常用于进行程序的后台任务 如计算 调度等工作 它不用从 CWinThread 类派 生来创建 最重要的是实现完成工作者线程任务的运行控制函数 简单地说 工作者线程就是自己 所写的一个函数 就是这个函数来进行线程工作的 由其他语句调用函数将这个线程启动 它的启 动与用户界面线程不同 使用了 AfxBeginThread 的另一个重载版本 如上所说工作者线程必须实现控制函数 一般以以下的方式来实现 首先对函数进行声明 如果要让一个名为 FunctionName 的函数来进行线程的工作则按以下来 声明 UINT FunctionName LPVOID pParam 以上的声明要保存在一个头文件件中 在 CPP 文件中对其进行定义 在定义之前要先把头文 件包含进来 然后定义如下 UINT FunctionName LPVOID pParam 这里面写工作线程所要做的工作 其中 pParam 参数是一个 32 位的值 是创建线程对象时传递给构造函数的值 这个参数的解释 由控制函数和创建这个线程的调用者共同约定 可以是一个简单类型值 如整形 也可以是指针 还可以忽略不用 如果是结构指针 那么这个结构不仅可以传递数据给线程 还可以从线程传递数 据给调用者 当函数终止时 返回一个 UINT 值 指明终止的原因 一般用 0 来表示成功 其他值 指明错误原因 调用者可以使用 GetExitCodeThread 函数获取到这个返回值 在定义时 只要将此函数作为全局的函数来定义即可 在启动的时候要用到 AfxBeginThread 下面详细的介绍启动工作者线程时所用此函数的版本 8 CWinThread AfxBeginThread AFX THREADPROC pfnThreadProc LPVOID pParam int nPriority THREAD PRIORITY NORMAL UINT nStackSize 0 DWORD dwCreateFlags 0 LPSECURITY ATTRIBUTES lpSecurityAttrs NULL 课程设计 基于 MFC 的图片处理系统的设计与实现 4 以下对函数的各个参数进行具体的说明 pfnThreadProc 线程的控制函数 可以在此函数中实现线程的功能 pParam 用来传递参数给线程 如果不需要给线程传递任何参数 可以把它设为 NULL nPriority 新线程的优先权 默认值表示新线程的优先权与目前优先权相同 nStackSize 新线程的堆栈大小 以字节为单位 0 表示使用默认的堆栈大小 dwCreateFlags 此值必须为 0 或 CREATE SUSPENDED 使用 0 表示立刻开始执行线程的控 制函数 lpSecurityAttrs 给新线程指定安全属性 通常可以为 NULL 在创建工作者线程是 pfnThreadProc 参数不能为空 因为它是工作者线程控制函数的指针 PParam 是传递给控制函数的参数 AfxBeginThread 函数创建和初始化 CWinThread 对象 使用控制 函数启动线程 并返回 WinThread 对象指针 二 用户界面线程 9 用户界面线程通常用于处理用户输人并响应各种事件和消息 其实 应用程序的主执行线程就 是 CWinThread 类的派生类 CWinApp 的对象 它其实就是一个用户界面线程 由应用程序启动时自 动创建和启动 只不过它是一个主线程 同样它的终止也就意味着程序运行结束 进程终止 创建一个用户界面线程 可以按照以下的步骤来实现 从 CwinThread 派生一个类必须使用 DECLARE DYNCREATE 和 IMYLEMENT DYNCREATE 声明和实现 WinThread 派生类 如下所示 IMPLEMENT DYNCREATE MyThread CWinThread 类的声明如下 class MyThread public CwinThread DECLARE DYNCREATE MyThread 声明类成员函数和变量 DECLARE MESSAGE MAP 以上的工作可以由 MFC 自己来完成 由于工作界面线程可以响应用户的一些消息 并且可以显 示界面 那么界面的初始化工作必不可少 那么在派生类中需要重载父类的几个函数 以下把常用 的几个函数列出来 用户界面线程一般所用函数如下 函数名函数说明要 求 Exitlnstance 在线程终止时执行清理工作一般需要重载 Initlnctance 线程初始化必须重载 ondle 执行线程空闲处理一般不可重载 PrcTranslateMessage 消息分拣前进行过滤处理一般不可重载 课程设计 基于 MFC 的图片处理系统的设计与实现 5 ProcessWndProcException 响应该线程中未处理的异常一般不可重载 Run 线程控制函数包括消息循环很少重载 工作者线程有线程处理函数 用户界面线程同样也有 不过由于用户界面线和中实现的就比较 麻烦些 实际上用户界面线程中的线程处理函数就是消息处理函数 例如 如果消息处理函数为 MyseeStart 与 MyseeEnd 那么可以用以下方式来完成 首先定义两个消息 ID define WM MY SEE START WM USER 1 define WM MY SEE END WM USER 2 再定义两个消息处理函数 afx msg LONG MyseeStart UINT wParam LONG Iparam afx msg LONG MyseeEnd UINT wParam LONG Iparam 然后在 BEGIN MESSAGE MAP 与 END MESSAGE MAP 之间进行消息映射即 BEGIN MESSAGE MAP ON THREAD MESSAGE WM MY SEE START MySeeStart ON THREAD MESSAGE WM MY SEE END MySeeEnd END MESSAGE MAP 当要进行消息处理时 调用 postThreadMessage 函数即可 以上用户界面线程的的准备工作己经就绪 下面就是如何启动一个线程了 与工作者线程一样 用户界面线程也调用的是 AfxBeginThread 不过是另一个版本 如下 CWinThread AfxBeginThread CRuntimeClass pThreadClass int nPriority THREAD PRIORITY NORMAL UINT nStackSize 0 DWORD dwCreateFlags 0 LPSECURITY ATTRIBUTES 1pSecurityAttrs NULL pThreadClass 是 CWinThread 派生类的 CRuntimeClass 指针 就是用户界面线程类的 RUNTIME CLASS 信息 这个指针可以使用宏 RUNTIME CLASS CMyThreadClass 来得到括号的里面是 用户界面线程的名字 其他参数与工作者线程相同 AfxBeginThread 函数创建一个新的 CWinThread 派生类对象 用定义的类中的信息进行初始化 调用它的成员函数 CreateThread 来启 动执行线程 并且返回一个指向这个线程的指针 三 线程的终止 一 工作者线程的终止 10 对于工作者线程而言 控制函数正常执行到函数中的结束点 相应的线程也就正常终止了 return 语句的返回值可以表示终止的原因 另外还可以使用 AfxEndThread 函数 指明线程退出码 它只能在要终止的线程内部自己调用 二 用户界面线程的终止 课程设计 基于 MFC 的图片处理系统的设计与实现 6 对于用户界面线程 可以在任意处调用 PastQuitMessage 函数发出退出消息 线程对象消息循 环响应后 正常终止线程 对于工作者线程与用户界面线程 也可以使用强制终止即调用 TerminateThread 函数来强制终 止一个线程 2 4 图片格式介绍 在进行图片处理开发时 必须对图片的格式有一定的了解 由于本系统使用的是 GDI 在系 统中运用了对 BMP 图片操作 所以以下主要介绍下 BMP 图片的格式 11 一 BMP 文件组成 BMP 文件由文件头 位图信息头 颜色信息和图形数据四部分组成 文件头主要包含文件的大 小 文件类型 图像数据偏离文件头的长度等信息 位图信息头包含图象的尺寸信息 图像用几个 比特数值来表示一个像素 图像是否压缩 图像所用的颜色数等信息 颜色信息包含图像所用到的 颜色表 显示图像时需用到这个颜色表来生成调色板 但如果图像为真彩色 既图像的每个像素用 24 个比特来表示 文件中就没有这一块信息 也就不需要操作调色板 文件中的数据块表示图像 的相应的像素值 二 BMP 文件头 12 BMP 文件头数据结构含有 BMP 文件的类型 文件大小和位图起始位置等信息 其结构定义如下 typedef struct tagBITMAPFILEHEADER WORD bfType 位图文件的类型 必须为 BM DWORD bfSize 位图文件的大小 以字节为单位 WORD bfReserved1 位图文件保留字 必须为 0 WORD bfReserved2 位图文件保留字 必须为 0 DWORD bfOffBits 位图数据的起始位置 以相对于位图文件头的偏移量表示 以字节为单 位 BITMAPFILEHEADER 该结构占据 14 个字节 三 位图信息头 BMP 位图信息头数据用于说明位图的尺寸等信息 其结构如下 typedef struct tagBITMAPINFOHEADER DWORD biSize 本结构所占用字节数 LONG biWidth 位图的宽度 以像素为单位 LONG biHeight 位图的高度 以像素为单位 WORD biPlanes 目标设备的平面数不清 必须为 1 WORD biBitCount 每个像素所需的位数 必须是 1 双色 4 16 色 8 256 色 或 24 真彩 色 课程设计 基于 MFC 的图片处理系统的设计与实现 7 DWORD biCompression 位图压缩类型 必须是 0 不压缩 1 BI RLE8 压缩类型 或 2 BI RLE4 压缩类型 之一 DWORD biSizeImage 位图的大小 以字节为单位 LONG biXPelsPerMeter 位图水平分辨率 每米像素数 LONG biYPelsPerMeter 位图垂直分辨率 每米像素数 DWORD biClrUsed 位图实际使用的颜色表中的颜色数 DWORD biClrImportant 位图显示过程中重要的颜色数 BITMAPINFOHEADER 该结构占据 40 个字节 四 颜色表 颜色表用于说明位图中的颜色 它有若干个表项 每一个表项是一个 RGBQUAD 类型的结构 定 义一种颜色 RGBQUAD 结构的定义如下 typedef struct tagRGBQUAD BYTErgbBlue 蓝色的亮度 值范围为 0 255 BYTErgbGreen 绿色的亮度 值范围为 0 255 BYTErgbRed 红色的亮度 值范围为 0 255 BYTErgbReserved 保留 必须为 0 RGBQUAD 上述是 BMP 文件格式的说明 搞清楚了以上的结构 就可以正确的操作图像文件 对它进行 读或写操作了 3 需求分析与系统设计 3 1 需求分析 3 1 1 用户需求 要设计一个性能良好的系统 明确用户的应用环境对系统的要求是首要的和基本的 本系统从 以下三个方面对用户需求进行了分析 一 户所要处理图片的量 在不同的场合下 用户所要处理的图片的量是不同的 有时候用户会对大批量的图片进行处理 有时候可能只对有限的几个图片进行处理 所以此系统要对不同量的图片进行不同的处理 二 用户的处理效率要求 如果用户进行图片处理的数目过多 那么图片的处理的时间会很长 这个时候要考虑到用户可 能会对图片的处理时间有要求 所以系统要提供一种高效的图片处理机制 三 对系统的健壮性要求 在用户操作的过程中 可能会进行一些误操作 这个时候要保证系统不会因此而崩溃 应当有 课程设计 基于 MFC 的图片处理系统的设计与实现 8 一定的错误处理机制 在进行误操作时应该进行有效的提示 3 1 2 系统需求分析 参照用户需求 系统为了满足用户的需要当前的系统需要以下功能 用户所要处理的图片的量的不同 则可以提供两个模块 一个模块可以处理大量的图片 另一 个可以处理少数的几个图片 针对用户对处理的效率的要求 如果用户有图片的处理效率的要求的话 可以再加上一个模块 此模块可以用多线程来处理 以提高效率 此外 系统还要提供用户对图片来源的输入 及用户对图片处理后的输出的设置 以及图片的 处理要求的设置 由以上系统分析则系统的功能如下 系统可以分为三个模块 分别为批处理模块 单个文件处理模块 快速处理模块 在实现不同 模块时 所用的技术也不相同 一 批量处理模块包括以下几个方面 一 提供文件夹选择对话框 以确保用户可以选取源文件夹与目标文件夹 二 提供图片格式设定对话框 以确保用户可以设定要转换的格式 三 提供图片大小设定对话框 以确保用户可以设定要转换的大小 四 提供开始转按扭 可以让用户在设定完毕后进行相应的转换 二 单文件处理模块包括以下几方面 一 在添加第一个文件时 提供选择文件对话框 以让用户选择处理后的图片的存放位置 二 提供选择文件对话框 让用户可以选择要处理的单个图片文件 三 当用户选择单个文件后 在用户界面上应当可以显示所选的图片的路径 以供用户参 考 四 提供删除所选文件的功能 以便用户在进行误操作时可以更改 五 除了以上功能外 也应该可以进行图片的设置与转换 三 快速处理模块包括以下几方面 由于快速处理模块与批处理的唯一区别是内部的实现 批处理只是简单的浏览源文件夹中的图 片 然后一个一个的转后并且存到目标文件夹中去 而快速处理在内部运用了多线程的技术 所以 提供的功能是一样的 只是快速处理更有效率更高一些 见下图图片处理系统的总体架构 课程设计 基于 MFC 的图片处理系统的设计与实现 9 图 3 1 图片处理系统总架构 以上即为图片处理系统的总体架构 这个架构是基于对用户与系统的分析上得出来的 当完成这 个架构后 可以对每个模块进行具体的系统设计 也可以针对各个模块来画出流程图 以下即为 从用户的操作出发所画的系统的流程图 3 2 系统设计 3 2 1 系统流程设计 图 3 2 系统总体流程图 3 2 2 系统模块设计 由以上的需求分析可以得知用户的需求 进而可以确定本系统的功能 从而可以对系统分出设 计模块 并对各个模块进行详细的设计 本系统可以用三个模块来完成 三个模块的划分根据所要 处理的图片的量的不同 其中每个模块都提供二种不同的处理模式 即图片的格式的处理及图片的 大小的处理 一 批处理模块 这个模块处理大量的图片 选好文件来源及处理后所放的文件 设置好所要处理的图得的信息 后 即可处理 一 格式转换功能内部实现总设计 课程设计 基于 MFC 的图片处理系统的设计与实现 10 图 3 3 格式转换内部运行总体流程 以上为此模块的格式转换功能的流程式图 如果要实现以上功能 那么在界面上要有一个按扭 如果用户点击 会出现一个对话框 用户将在这一个对话框中选择源文件夹与目标文件夹 在这个 对话框上还要有两个按扭 以提供给用户选择 当点击后才会出现一个选择文件夹对话框 以供用 户选择 在总体的界面上 还要提供一个设定图片的转换格式按扭 当用户点击后 即弹出一个图片格 式设定对话框 用户可以从组合框选择以进行要转换的格式的设定 一个设定图片的大小的按扭不可少 用户可以点击它 然后弹出一个图片的大小的设定 用户 可以在其中输入要转换的大小 以进行图片的大小的设定 然后还要提供两个开始转换的按扭 以开始的转换 二 格式转换功能内部实现流程 1 得到图片的总数初始化进度条 这一块与浏览文件夹得到图片的路径相同将在下面详细介绍 2 浏览文件夹得到文件路径 课程设计 基于 MFC 的图片处理系统的设计与实现 11 图 3 4 浏览文件夹得到文件路径流程图 3 得到路径进行格式转换流程 课程设计 基于 MFC 的图片处理系统的设计与实现 12 图 3 5 得到路径后进行格式转换流程 三 图片大小转换功能内部实现总设计 图 3 6 图片大小转换总体流程 课程设计 基于 MFC 的图片处理系统的设计与实现 13 四 图片大小转换功能内部实现各功能的实现流程 由于图片的大小转换其中用到图片的格式转换 所以与之有相同的这里就再不介绍 这里主要介 绍 如何将 BMP 图片转换成想要的大小 1 将 BMP 转换成所要大小的功能流程 图 3 7 将 BMP 图片转换大小流程图 1 转换图片显示到设备上 图 3 8 将转换后的图片显示到设备上 课程设计 基于 MFC 的图片处理系统的设计与实现 14 2 将变换后的图片选入到内存 DC 中去 图 3 9 将转换大小后图片选入到内存 DC 3 将内存中的位图保存为文件 图 3 10 将内存中位图保存为文件 课程设计 基于 MFC 的图片处理系统的设计与实现 15 二 单个文件处理模块 这个模块处理少量的图片 首先选取处理后所存放的文件夹 然后选取一定数目的文件 设置 好处理信息即可处理 此模块与批处理模块大体相同 所以在这里就不现多加描述 三 快速处理模块 这个模块可以处理大量的图片 与批处理模块不同的是 此模块运用了多线程的技术 在需要 效率的情况下可以选择使用 此模块与批处理模块大体相同 所以在这里就不现多加描述 4 系统实现 这个阶段的主要目标是将系统分析阶段所提出的反映了用户信息要求的系统逻辑方案转换成可 以实施的基于计算机的物理方案 本系统由三个模块构成 下面分别就这三个模块的具体的计算机 实现来描述 本系统是基于对话框的应用程序 首先看一下整体的界面 图 4 1 系统运行后整体界面 4 1 批处理模块 4 1 1 批量处理模块功能的实现 如果要实现以上功能 那么在界面上要有一个按扭 如果用户点击后则会出现一个对话框 用 户将在这一个对话框中选择源文件夹与目标文件夹 在这个对话框上还要有两个按扭以提供给用户 课程设计 基于 MFC 的图片处理系统的设计与实现 16 选择 当点击后才会出现一个选择文件夹对话框 以供用户选择 在总体的界面上 还要提供一个设定图片的转换格式按扭 当用户点击后即弹出一个图片格式 设定对话框 用户可以从组合框选择以进行要转换的格式的设定 一个设定图片的大小的按扭不可少 用户可以点击它 然后弹出一个图片的大小的设定 用户 可以在其中输入要转换的大小 以进行图片的大小的设定 然后还要提供两个开始转换的按扭以开的转换 4 1 2 批处理模块核心技术 一 选择文件夹对话框 一 当用户决定使用批量处理来进行图片的处理时首先点击 批量处理按扭 这个时候 会弹出一个对话框 如下图 13 图 4 2 选择文件夹界面 以下为其具体的实现代码 显示以上对话框的代码由 CBMPConversionDlg 类中的消息函数 OnAllOnece 来完成 void CBMPConversionDlg OnAllOnece TODO Add your control notification handler code here 点击批处理时为一 howToDo 1 AllOneceDialog allOnece 创建一个对话框 if allOnece DoModal IDOK 点击确定按扭后将执行以下操作 sourceFolder allOnece m showSource destFolder allOnece m showDest trueDestFolder allOnece m showDest 二 这个时候 用户可以点击文件框后面的按扭来进行文件夹的选择 点击按扭后弹出的 课程设计 基于 MFC 的图片处理系统的设计与实现 17 选择文件夹对话框如下 图 4 3 选择文件夹对话框 以上对话框只用于选择文件夹 可以分别点击源文件夹及目标文件夹后面的按扭 来进行待处 理的图片的位置与处理后的图片的所放的位置的设定 实现选择文件夹的代码如下 CString AllOneceDialog GetPath CString strPath 置返回的参数为空 BROWSEINFO bInfo 创建一个浏览信息类的对象 ZeroMemory 将对像置空 并分配空间 bInfo hwndOwner m hWnd 这个对话框属于 m hWnd 窗体 bInfo lpszTitle T 请选择路径 初始化标题 bInfo ulFlags BIF RETURNONLYFSDIRS 只返回文件夹 LPITEMIDLIST lpDlist 用来保存返回信息的 IDList lpDlist SHBrowseForFolder 显示选择对话框 if lpDlist NULL 用户按了确定按钮 TCHAR chPath 255 用来存储路径的字符串 SHGetPathFromIDList lpDlist chPath 把项目标识列表转化成字符串 strPath chPath 将 TCHAR 类型的字符串转换为 CString 类型的字符串 return strPath 这个函数用来显示上图所示的选择文件夹对话框 并且将用户所选的文件夹的路径返回 此函 数的调用由以下的消息函数完成 当点击源文件夹后的按扭时 课程设计 基于 MFC 的图片处理系统的设计与实现 18 void AllOneceDialog OnSourcefolder TODO Add your control notification handler code here m showSource GetPath 调用函数 GetDlgItem IDC EDITSOURCE SetWindowText m showSource 点击目标文件夹后的按扭的时候 void AllOneceDialog OnDestfolder TODO Add your control notification handler code here m showDest GetPath 调用函数 GetDlgItem IDC EDITDEST SetWindowText m showDest 由以上消息函数调用 CString AllOneceDialog GetPath 函数 并将返回的文件夹的路径提供给 应用程序 二 图片格式设定对话框 当选择好源文件夹与目标文件夹后 可以进行图片格式设定 以进行图片格式转换处理 点击 图片格式设置按扭后 将弹出图片格式设定对话框 如下图 图 4 4 选择转换格式对话框 用户可以利用组合框来设定要处理的格式 以下是实现的代码 利用消息处理函数 void CBMPConversionDlg OnSelectformat 来实现 void CBMPConversionDlg OnSelectformat TODO Add your control notification handler code here SelectFormatDlg formatDlg if formatDlg DoModal IDOK 课程设计 基于 MFC 的图片处理系统的设计与实现 19 if formatDlg m format T BMP formatNumber 1 trueFormatNumber 1 if formatDlg m format T JPG formatNumber 2 trueFormatNumber 2 if formatDlg m format T GIF formatNumber 3 trueFormatNumber 3 if formatDlg m format T PNG formatNumber 4 trueFormatNumber 4 三 图片大小设置对话框 用户也可以进行图片的大小设置 以进行图片的大小转换 点击 图片大小设置按扭 会弹出 图片大小设置对话框 图如下 图 4 5 自由设置对话框 课程设计 基于 MFC 的图片处理系统的设计与实现 20 利用这个对话框 用户可以任意设置所要转换图片的大小 实现的代码如下 按自由设置的按扭 void CBMPConversionDlg OnSetasfree TODO Add your control notification handler code here 定义一个对话框对象 FreeDlg freeDlg if freeDlg DoModal IDOK 从对话框得到值 m mapHeight freeDlg m freeHeight m mapWidth freeDlg m freeWidth 四 开始格式转换 用户己经设置了源文件夹与目标文件夹 并且己经设置了图片的处理方式 下面就是由程序自 动处理这些图片 利用用户提供的源文件夹的路径 程序将图片的信息一一读出来 然后进行图片处理 然后将 处理的结果放入到目标文件夹中去 一 图片的读取 此部分将在快速处理模块中详细介绍 二 图片的格式转换 由于本系统采用了 GID 在 GDI 中引入了对 COM 组件对象模型 技术的支持 通过 COM 技术 GDI 简化了对图像文件的访问 它是通过调用 COM 组件来实现的 GDI 扮演的只是 指挥者 而非操作员 对于图像文件 GDI 所关心的不是图像文件的文件头信息 不论要打开的 文件格式是什么类型 GDI 首先要做的是在注册表中查看该图像格式的编码 或解码 信息是否 已经注册 HKEY CLASSES ROOT MIME Database Content Type 如果已经注册 就通过该编码 信息调用 COM 组件 所以这里要用到几个函数 14 15 1 查看系统中可用的图像编码信息 数量及大小 Status GetImageEncodersSize UINT numEncoders 存储编码器数量的地址 UINT size 存储编码信息所需内存大小 2 得到所有的编码信息 Status GetImageEncoders 课程设计 基于 MFC 的图片处理系统的设计与实现 21 UINT numEncoders 可用编码器数量 UINT size 存储编码器信息所需内存 由 ImageCodecInfo 类组成的数组的大小 ImageCodecInfo encoders 编码器信息指针 在 GetImageEncoders 函数中 参数 numEncoders 和 size 都是由 GetImageEncodersSize 返回的 3 在注册表中查找编码的方式 int GetImageCLSID const WCHAR format 所要查找的格式 CLSID pCLSID 获取编码信息 4 由于 GDI 中使用的是宽字节 所以要有一个向宽字节转换的函数 WCHAR CBMPConversionDlg ToWChar char str static wchar t buffer 1024 memset buffer 0 100 sizeof wchar t MultiByteToWideChar CP OEMCP 0 str strlen str buffer 1024 return buffer 图片转换的详细步骤如下 1 利用 Image 类来读取图片 Image im Image FromFile ToWChar szFilePathName szFilePathName 为源路径 2 根据用户所选得到所在转换的图片的编码信息 如果想得到 BMP 的信息 如下 18 CLSID Clsid 创建一个编码信息 GetEncoderClsid L image bmp 查找 BMP 编码信息 存入 Clsid 下面给出 GetEncoderClsid 函数中的一些重要代码 UINT num 0 UINT size 0 GetImageEncodersSize 得到所有图片格式的编码的数量 及大小 把所有的图片编码信息放入到 pImageCodecInfo 中去 GetImageEncoders num size pImageCodecInfo 以下利用要找的图片格式 与己存在的图片的格式匹配 如果有则将其编码信息保存在 Clsid 中去 for UINT j 0 j Save ToWChar szdestFilePathName 以上即可以完成图片的格式转换的工作 五 开始大小转换 当用户设定好源文件夹及目标文件夹并且设定好要转换的大小时 可以点击 开始大小转换 按扭来进行大小转换 一 源文件读取 将在快速处理模块进行详细的介绍 二 图片的大小转换 由于图片的大小转换中用到了 GDI 中的函数 StretchBlt 所在在转换大小时 源文件必须为 BMP 格式的 因而在转换之前先将源文件全部转换成 BMP 格式 然后再将源文件用 StretchBlt 函 数进行拉伸 或缩小 最后再将变换后的 BMP 格式的图片转回所要的格式 当然后中间步骤是程 序自动完成的 图片的大小转换由以下步骤完成 1 将源文件夹中的图片全部转换成 BMP 格式 放入目标文件夹中 详细说明参考图片格式转换 2 将目标文件夹中的 BMP 格式的图片利用 StretchBlt 函数转换大小 16 17 1 BMP 文件的加载 CBitmap m bitmap 位图对象 装载位图文件 HBITMAPhBitmap HBITMAP LoadImage NULL filePath IMAGE BITMAP 0 0 LR LOADFROMFILE m bitmap Attach hBitmap 转成 Cbitmap 2 将位图图片进行拉伸或放缩操作 并将其在图片控件上显示出来 CRect rect 0 0 m mapWidth m mapHeight 设置要转换的图片的大小 pDC SetStretchBltMoe COLORONCOLOR 设置拉伸及收缩的模式 pDC StretchBlt 0 0 rect right rect bottom 将图片进 行操作 且在设备上显示出来 3 将设备 DC 上显示的图片再存放到内存 DC 中去 利用 HBITMAP CBMPConversionDlg CopyDCToBitmap HDC hScrDC LPRECT lpRect 函数 其 课程设计 基于 MFC 的图片处理系统的设计与实现 23 中 hScrDC 为图片控件的 DC lpRect 为显示的图片的矩形区 再将内存 DC 中的图片保存到目标文件夹中去 使用 BOOL CBMPConversionDlg SaveBmp HBITMAP hBitmap CString FileName 其中 hBitmap 为利用内存 DC 创建的位图 FileName 为要保存的路径 4 完成后再将图片的格式转换为原来的格式 详细说明参考图片格式转换 5 将图片大小转换的中间产物 BMP 格式的图片删掉 利用 void CBMPConversionDlg deleteBmp CString strFile 此函数的作用是将目标文件夹中的 BMP 格式的文件删掉 4 2 单文件处理模单文件处理模块块 4 2 1 单文件处理模块功能实现 单个文件处理 与批处理有许多的相同之处 这里只介绍不同的地方 由于单个文件的源文件 并不是来源于一个源文件夹 它的来源是用户自己选择的图片 所以必须要用 Carray 类的对象来 保存所选的文件的路径 用户每选择一个文件要在界面的右上角进行显示 以便用户进行核对 可以及时更正 也使操 作的界面更加的直观 这里就要用到文本框 此外用户还可以将选择的文件删除以重新选择文件 4 2 2 单文件处理模块核心技术 与批处理相同的地方在这里就不再说明了 一 添加单个文件操作 当用户点击 添加单个文件 按扭时 第一次会首先弹出一个选择文件夹对话框 以供用户选 择处理后的文件放入哪个文件夹 然后弹出一个选择文件对话框 以供用户选择要处理的文件 在 界面的左上角会显示用户己经选择的文件的路径 实现的代码如下 void CBMPConversionDlg OnAddOneFile howToDo 2 if addAndDelete 0 AfxMessageBox 请先选择目标文件夹 destFolder GetPath 调用选择文件夹对话框 TODO Add your control notification handler code here 首先要做一个打开文件的对话框 CFileDialog dlg TRUE NULL NULL OFN HIDEREADONLY OFN OVERWRITEPROMPT 课程设计 基于 MFC 的图片处理系统的设计与实现 24 OFN ALLOWMULTISELECT 图片文件 bmp bmp bmp 图片文件 jpg jpg jpg 图片文件 gif gif gif 图片文件 png png png AfxGetMainWnd if dlg DoModal IDOK 得到文件的路径 oneFileName dlg GetPathName 把文件的路径加入到 ARRAY 里面去并且加 oneFile Add oneFileName switch ad

温馨提示

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

评论

0/150

提交评论