基于vc的图像处理系统设计与实现.docx

上传人:b****1 文档编号:14443822 上传时间:2023-06-23 格式:DOCX 页数:29 大小:165.51KB
下载 相关 举报
基于vc的图像处理系统设计与实现.docx_第1页
第1页 / 共29页
基于vc的图像处理系统设计与实现.docx_第2页
第2页 / 共29页
基于vc的图像处理系统设计与实现.docx_第3页
第3页 / 共29页
基于vc的图像处理系统设计与实现.docx_第4页
第4页 / 共29页
基于vc的图像处理系统设计与实现.docx_第5页
第5页 / 共29页
基于vc的图像处理系统设计与实现.docx_第6页
第6页 / 共29页
基于vc的图像处理系统设计与实现.docx_第7页
第7页 / 共29页
基于vc的图像处理系统设计与实现.docx_第8页
第8页 / 共29页
基于vc的图像处理系统设计与实现.docx_第9页
第9页 / 共29页
基于vc的图像处理系统设计与实现.docx_第10页
第10页 / 共29页
基于vc的图像处理系统设计与实现.docx_第11页
第11页 / 共29页
基于vc的图像处理系统设计与实现.docx_第12页
第12页 / 共29页
基于vc的图像处理系统设计与实现.docx_第13页
第13页 / 共29页
基于vc的图像处理系统设计与实现.docx_第14页
第14页 / 共29页
基于vc的图像处理系统设计与实现.docx_第15页
第15页 / 共29页
基于vc的图像处理系统设计与实现.docx_第16页
第16页 / 共29页
基于vc的图像处理系统设计与实现.docx_第17页
第17页 / 共29页
基于vc的图像处理系统设计与实现.docx_第18页
第18页 / 共29页
基于vc的图像处理系统设计与实现.docx_第19页
第19页 / 共29页
基于vc的图像处理系统设计与实现.docx_第20页
第20页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于vc的图像处理系统设计与实现.docx

《基于vc的图像处理系统设计与实现.docx》由会员分享,可在线阅读,更多相关《基于vc的图像处理系统设计与实现.docx(29页珍藏版)》请在冰点文库上搜索。

基于vc的图像处理系统设计与实现.docx

基于vc的图像处理系统设计与实现

 

毕业设计(论文)

基于VC++的图像处理系统

设计与实现

VC++basedImageProcessingSystemDesignandImplementation

 

班级计/商061

学生姓名学号

指导教师职称

导师单位徐州工业职业技术学院信息系

论文提交日期

 

一.选题意义及背景:

图像处理技术一直是困扰VisualC++初学者的一个难题,在VisualC++中,没有一个完善的控件能够显示和处理各种格式的图像,有时用户需要了解各种图像的文件格式,这极大的增加了初学者的学习难度。

基于此,设计了一个图像处理软件,本课题属于小型的图像处理软件,主要用于实现图像的显示与批量转换操作。

通过分析系统的工作过程,将其用VisualC++程序实现,将理论学习与实例相结合,来培养学生的综合能力。

二.毕业设计(论文)主要内容:

主要工作:

负责程序各个功能的整合、调试及运行

三.计划进度:

阶段

工作程序和要求

完成时间

前期准备阶段

学习毕业设计管理规定并准备与测试有关的资料

09.10.19

中期指导检查阶段

1.需求分析阶段及建立软件及硬件环境条件。

分析设计任务书的要求和用户需求,进行可行性分析和需求分析,确定系统所需的模版,安装建立设计所需软硬件环境;素材采集,处理

09.10.20-09.10.30

2.在确定的模版上,对系统功能进行分工,进行相关程序设计,根据用户的使用反馈结果修正自己的设计方案,在解决了大部分的bug后,可以将系统进行打包。

09.11.02-09.11.04

3.进行软件的性能测试,

09.11.04-09.11.06

4.编写测试脚本,并对测试结果进行分析

a.编写测试脚本

b.对测试结果进行分析

09.11.09-09.11.13

后期答辩总结阶段

1.编写毕业论文

a.学习书写毕业论文规范

b.查找与所要写的论文有关资料

c.根据论文书写规范编写论文

d.给指导老师审查并修改

09.11.16-09.11.26

2.交毕业设计

09.11.27

3.准备答辩

09.11.27

四.毕业设计(论文)结束应提交的材料:

1、测试计划

2、测试脚本

3、测试报告

4、毕业论文

指导教师教研室主任

年月日年月日

论文真实性承诺及指导教师声明

学生论文真实性承诺

本人郑重声明:

所提交的作品是本人在指导教师的指导下,独立进行研究工作所取得的成果,内容真实可靠,不存在抄袭、造假等学术不端行为。

除文中已经注明引用的内容外,本论文不含其他个人或集体已经发表或撰写过的研究成果。

对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。

如被发现论文中存在抄袭、造假等学术不端行为,本人愿承担本声明的法律责任和一切后果。

毕业生签名:

日期:

 

指导教师关于学生论文真实性审核的声明

本人郑重声明:

已经对学生论文所涉及的内容进行严格审核,确定其内容均由学生在本人指导下取得,对他人论文及成果的引用已经明确注明,不存在抄袭等学术不端行为。

指导教师签名:

日期:

 

摘要

本文对图形图像处理系统的发展现状和所采用的主要技术进行了详细分析,确定了相应的结构和主要功能,以及实际开发中所采取的技术。

系统在WindowsXP平台下实现,本课题是采用VisualC++作为编程工具,采用面向对象的程序设计技术实现一个图形绘制和图像处理的应用软件。

主要工作分为三类,包括基本图形绘制与编辑、简单的图像处理、图像格式的转换。

图形方面主要是设计图形基类,以及继承图形基类的具体图形类。

通过对独立功能的封装,可以为今后需要的图形图像的应用奠定基础。

系统的优点有:

充分体现了面向对象的设计思想,充分运用了C++的特性。

程序结构清晰,可读性好,程序中做了充分的注释。

最后,对系统进行测试表明,系统功能达到了预期的要求,界面友好,操作简便,运行也较稳定,是一个完成基本功能的图形图像系统。

总体上,本文介绍了系统开发设计的全过程和设计过程中部分代码,对系统中采用的关键技术也作了一些必要的说明,对图像变换的基本原理,图像处理的基本原理和各种图像格式做了详细的阐述。

关键词:

图像处理系统,图像显示,图片格式转换。

Abstract

Thisarticlehascarriedonthedetailedanalysisaboutgraphimageprocessingsystemdevelopmentandusingofthekeytechnology,identifythecorrespondingstructureandcentralfunction,aswellasthesystemadoptstechnologyintheactualdevelopment.ThesystemrealizesundertheWindowsXPplatform,thetopicuseVisualC++asaprogrammingtool,useobject-orientedprogrammingtechniquestoachieveagraphicandimageprocessingsoftware.Majorworkisdividedintothreecategories,basicdrawingandeditinggraphics,simpleimageprocessing,andimageformatconversion.Thegraphaspectisdesignsthegraphbaseclass,aswellasinheritsthegraphbaseclass’sspecificgraphclass.Throughindependentfunction'sencapsulation,forthefuture’sneedsofthegraphicimageslaysthefoundation.Thesystemmerithas:

theobject-orienteddesign’sthoughtapplicationofthec++properties,Program’sstructureisclear,goodreadability,codeshasthefullannotationintheprogram.Easyexpansionandtransplantation.

Finally,system’stestingshows,system’sfunctionsachievetheexpecteddemand,friendlyinterface,andtheoperationissimple,alsoamuchstableoperation,ithasbasicfunctionsofthegraphicimagesystem.

Asawhole,thispaperdescribesthesystemdesignprocessandpartoftheprocessofdesigningcode,itmadesomenecessaryexplanationsaboutkeytechnologyinthesystem,itmadethedetaileddescriptiontoimagetransformofthebasicprinciple,theimageprocessingbasicprincipleandvariousimageformats.

Keyword:

Theimageryprocessingsystem,imagedisplay,imagetransforms.

 

 

第一章图像处理系统

1.1概述

图像处理技术一直是困扰VisualC++初学者的一个难题,在VisualC++中,没有一个完善的控件能够显示和处理各种格式的图像,有时用户需要了解各种图像的文件格式,这极大地增加了初学者的学习难度。

基于此,设计一个图像处理软件。

1.2系统分析

1.2.1需求分析

⏹通过调查,要求系统具有以下功能。

⏹显示BMP、JPEG、GIF等各种格式的图像。

⏹实现BMP与JPEG、GIF图像的批量转换。

⏹实现对位图的旋转、反色、灰度化、线性变换等各种操作。

⏹实现手写数字的识别。

1.2.2可行性分析

为了降低程序开发的难度,使用微软公司的GDI+。

GDI+又称为GDIPlus,是微软公司.NET构架的一部分,它封装了各种图像的处理技术。

通过使用GDI,用户可以非常方便地实现图像的显示与转换。

虽然GDI+属于.NET框架的一部分,但是用户可以在非.NET环境下使用GDI+,有关具体的使用方法,在以下部分进行介绍。

1.3总体设计

1.3.1项目规划

图像处理系统是一个典型的图像处理软件,它由图像显示、图像转换、图像处理、字符识别、其他和帮助等模块组成。

●图像显示模块

该模块主要包括显示位图、显示JPEG、显示GIF3个部分。

●图像转换模式

该模块主要包括位图转换为JPEG、JPEG转换为位图、位图转换为GIF、GIF转换为位图4个部分。

●图像处理模块

该模块主要包括图像旋转、图像锐化处理、图像反色处理、灰度化处理、线性变换5个部分。

●字符识别模块

该模块主要包括手写数字识别。

●其他模块

该模块主要包括设置菜单的固定颜色和随机颜色两个部分。

●帮助模块

该模块主要包括软件的版本、开发单位等信息。

1.3.2系统功能架构图

其他

系统功能构架图如图1.1所示

图1.1图像处理系统功能架构图

1.4系统设计

1.4.1设计目标

本系统属于小型的图像处理软件,主要用于实现图像的显示与批量转换操作。

具体设计要求如下。

●实现各种图像格式的显示。

●系统采用良好的人机对话模式,界面设计美观、友好。

●支持图像的单一转换与批量转换。

●实现位图的各种常规操作。

例如图像旋转、灰度化处理、线性变换等。

●系统运行稳定、安全可靠。

1.4.2开发及运行环境

系统开发平台:

VisualC++6.0。

运行平台:

WindowsXP/Windows2000/Windows2003。

分辨率:

最佳效果1024*1280像素。

1.5技术准备

1.5.1基本绘图操作

绘图操作通常是指在窗口的某个区域输出位图图像。

窗口通常关联一个设备上下文CDC,所有的绘图操作都是通过CDC来完成的。

用户可以通过调用窗口类的GetDC方法获得一个CDC对象指针。

CDC提供BitBlt、StretchBlt等方法来输出位图,但是这些方法均需要借助另一个CDC对象来实现。

如何设置源设备上下文,并调用BitBit方法输出位图。

CDC*Pdc=GetDC();//获取窗口设备的上下文

CBitmapbk;//定义位图对象

CDCmemdc;//定义设备上下文

memdc.CreateCompatibleDC(pDC);//创建一个兼容的设备上下文

bk.LoadBitmap(IDB_CHESSBOARD);//加载位图对象

memdc.SelectObject(&bk);//选中位图

pDC->BitBlt(0,600,600,&memdc,0,0,SRCCOPY);//调用BitBlt方法输出位图

1.5.2内存画布的设计

在绘制图像时,如果频繁的进行多次绘图操作,会出现闪烁的情况。

为了防止闪烁的出现,可以设计一个临时的画布,称之为内存画布,让所有的绘图操作均在内存画布上进行,然后在内存画布对象失去作用域时将其输出到目标设备上下文中,这样就阻止了闪烁情况的出现,内存画布的设计代码如下:

m_pbmp->CreateCompatibleBitmap(Pdc,rect.Width(),rect,Height());

m_poldbmp=SelectObject(m_bmp);//选中位图对象

m_Pdc=PdC;//设置成员变量

m_Rect=rect;//设置成员变量

//将目标区域绘制在内存画布上

this->BitBlt(m_Rect.left,m_Rect.top,m_Rect.Width(),m_Rect.Height(),

Pdc,m_Rect.left,m_Rect.top,SRCCOPPY);

SelectObject(m_poldbmp);//选中之前选中的对象

If(m_pbmp!

=NULL)//判断位图对象是否为空

deletem_pbmp;//释放位图对象

DelectObject(this);//释放设备上下文

内存画布CMemDC只包含一个构造函数和析构函数,其中,在构造函数部分,将根据参数pDC创建一个兼容的设备上下文,并且将pDC的内容绘制在内存画布上;在析构函数中,会将内存画布的内容输出到目标设备的上下文中。

1.5.3自定义全局函数

在VisualC++中没有提供直接的函数用于获取文件的名称(去除扩展名)和获取文件的扩展名(去除文件名)。

为此,定义了两个全局函数来获取文件的名称和文件扩展名。

函数定义如下:

CStringExtractFileName(CString&str)//获取文件名称

{

intpos=str.ReverseFind(‘.’)}//反向查找“.”的位置

returnstr.Left(pos);//从左方开始截取字符串,并返回截取的字符串

}

CStringGetFileExtendedName(CString&strFile)//获取文件扩展名

{

intpos=strFile.ReverseFind(‘.’);//反向查找“.”的位置

returnstrFile.Right(strFile.GetLength()-pos-1)

}

菜单栏高度

在为本系统设计自定义菜单时,由于主界面对话框的宽度可以调整,导致菜单栏的高度会发生变化,如图1.2所示。

图1.2菜单栏高度

从1.2中可以发现,当对话框的宽度变化时,菜单栏的高度也会发生变化,这在绘制菜单的背景颜色时候会带来困难,需要从user32.dll动态链接库中导出该函数。

流程图如下:

HMODULEhModule=:

:

LoadLibrary("user32.dll");

1.5.4自定义菜单

为了使程序界面更加美观,在本系统中自定义了一个菜单,实现菜单的特殊效果显示,如图1.3所示:

图1.3自定义菜单

在VisualC++中,实现自定义菜单是比较容易的,MFC类库提供了CMenu

类用于设计菜单,用户只要从该类派生一个子类,然后改写MeasureItem方法,设置菜单项的高度和宽度;改写DrawItem方法,根据菜单项的不同状态,绘制不同效果的菜单项就可以了。

具体设计如下:

(1)从CMenu类派生一个子类CCustomMenu。

(2)定义一个菜单项结构CMenuItem,记录菜单项的信息。

代码如下:

//定义一个结构,记录菜单项的详细信息

StructCMenuItem

{

CStringm_Menutext;//菜单项的文本

UINTm_ImageIndex;//菜单项图像索引

Intm_MenuType;//菜单项的类型-2:

顶层菜单,-1:

弹出式菜单,0:

分隔条,其他:

普通菜单

(3)向CCustomMenu类中添加成员变量。

(4)在CCustomMenu类的构造函数中初始化成员变量。

CCustomMenu:

:

CCustomMenu()

{

m_ItemCount=0;//初始化菜单项数量

m_Index=0;//初始化整型变量

m_MenuList=NULL;//初始化菜单列表

m_BkColor=RGB(204,199,186);//初始化背景颜色

m_SelTopColor=RGB(193,210,238);//初始化顶层菜单颜色

m_RandColor=FALSE;//是否采用随机颜色

}

(5)在CCustomMenu类的析构函数中释放成员变量占据的堆空间。

CCustomMenu:

:

~CCustomMenu()

{

if(m_ItemCount>0)//如果菜单项>0,则释放菜单列表

delete[]m_MenuList;

}

 

(6)向CCustomMenu类中添加GetAllItemCount方法,获取菜单项的数量,当前流程图如下:

pMenu

CMenu*pMenu=CMenu:

:

FromHandle(hMenu);

intemcount=0

Multi

i++

i

inti=0

intcount=pMenu->GetMenuItemCount();

FirstFind

 

N

N

N

Y

Y

Y

 

(7)向CCustomMenu类中添加AttachMenu方法,附加菜单句柄到CCustomMenu类对象上

BOOLCCustomMenu:

:

AttatchMenu(HMENUhMenu)

{

Attach(hMenu);//附加菜单句柄到菜单对象

GetAllItemCount(hMenu,m_ItemCount);//获取菜单项的数量

if(m_ItemCount>0)//判断菜单项数量是否>0

m_MenuList=newCMenuItem[m_ItemCount];//创建菜单列表

returnTRUE;

}

(8)向CCustomMenu类中添加SetMenuItemInfo方法,将每个菜单项关联一个CMenuItem结构对象。

 

(9)向CCustomMenu类中添加GetTopMenuWidth方法,获取顶层菜单的高度。

流程图如下:

inti=0

(10)向CCustomMenu类中添加GetClientMenuRgn方法,获取菜单栏中的非菜单项区域。

流程图如下:

//获取菜单栏中非菜单项区域

HRGNCCustomMenu:

:

GetClientMenuRgn()

MENUBARINFOMenuInfo;//定义菜单项信息对象

memset(&MenuInfo,0,sizeof(MENUBARINFO));//初始化菜单项信息

MenuInfo.cbSize=sizeof(MENUBARINFO);

//设置菜单项信息结构的大小

GetMenuBarInfo(AfxGetMainWnd()->m_hWnd,OBJID_MENU,0,&MenuInfo);

CRectrc=MenuInfo.rcBar;//获取菜单栏的区域

intMenuCount=GetMenuItemCount();//获取顶层菜单的数量

CRect*pRC=newCRect[MenuCount];

//定义一个区域指针,记录菜单项区域

HRGN*pRgn=newHRGN[MenuCount];

//定义一个选区指针,记录菜单项选区

CRectwinRC;//定义一个区域对象

AfxGetMainWnd()->GetWindowRect(winRC);//获取主窗口区域

HRGNretRgn=CreateRectRgn(0,0,0,0);

HRGNMenuClientRgn=CreateRectRgn(0,0,0,0);

for(intj=0;j

//去除菜单栏中菜单项的区域,以获取非菜单项区域

CombineRgn(retRgn,MenuRgn,MenuClientRgn,RGN_DIFF);

for(j=0;j

MENUBARINFOMenuInfo;

(11)向CCustomMenu类中添加SetMenuItemText方法,绘制菜单项文本。

voidCCustomMenu:

:

SetMenuItemText(CDC*pDC,LPSTRstrMenuText,CRectRect)

{

Rect.DeflateRect(20,0);pDC->DrawText(strMenuText,Rect,DT_SINGLELINE|DT_VCENTER|DT_LEFT);

}

(12)向CCustomMenu类中添加DrawTopMenuBk方法,绘制顶层菜单的背景颜色。

(13)向CCustomMenu类中添加DrawSepMenu方法,绘制菜单分隔条。

voidCCustomMenu:

:

DrawSepMenu(CDC*pDC,CRectRect)

{

pDC->Draw3dRect(Rect,RGB(255,0,0),RGB(0,0,255));

}

(14)向CCustomMenu类中添加DrawMenuBk方法,绘制菜单项的背景颜色。

voidCCustomMenu:

:

DrawMenuBk(CDC*pDC,CRectRect,COLORREFSrcColor,COLORREFDesColor,BOOLState)

{

if(State)

{

pDC->Rectangle(Rect);

Rect.DeflateRect(1,1);

intr1,g1,b1;

//读取渐变起点的颜色值

r1=GetRValue(SrcColor);

g1=GetGValue(SrcColor);

b1=GetBValue(SrcColor);

intr2,g2,b2;

//读取渐变终点的颜色值

r2=GetRValue(DesColor);

g2=GetGValue(DesColor);

b2=GetBValue(DesColor);

floatr3,g3,b3;//菜单区域水平方向每个点RGB值应该变化的度(范围)

r3=((float)(r2-r1))/(float)(Rect.Height());

g3=(float)(g2-g1)/(float)(Rect.Height());

b3=(float)(b2-b1)/(float)(Rect.Height());

COLORREFr,g,b;//菜单区域水平方向每个点的颜色值

CPen*pOldPen;

for

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2