論文基于VC的圖像處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)_第1頁
論文基于VC的圖像處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)_第2頁
論文基于VC的圖像處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)_第3頁
論文基于VC的圖像處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)_第4頁
論文基于VC的圖像處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

論文基于VC的圖像處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)PAGE62PAGE1畢業(yè)設(shè)計(jì)(論文)基于VC++的圖像處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)VC++basedImageProcessingSystemDesignandImplementation班級(jí)計(jì)/商061學(xué)生姓名學(xué)號(hào)指導(dǎo)教師職稱導(dǎo)師單位徐州工業(yè)職業(yè)技術(shù)學(xué)院信息系論文提交日期 一.選題意義及背景:圖像處理技術(shù)一直是困擾VisualC++初學(xué)者的一個(gè)難題,在VisualC++中,沒有一個(gè)完善的控件能夠顯示和處理各種格式的圖像,有時(shí)用戶需要了解各種圖像的文件格式,這極大的增加了初學(xué)者的學(xué)習(xí)難度。基于此,設(shè)計(jì)了一個(gè)圖像處理軟件,本課題屬于小型的圖像處理軟件,主要用于實(shí)現(xiàn)圖像的顯示與批量轉(zhuǎn)換操作。通過分析系統(tǒng)的工作過程,將其用VisualC++程序?qū)崿F(xiàn),將理論學(xué)習(xí)與實(shí)例相結(jié)合,來培養(yǎng)學(xué)生的綜合能力。二.畢業(yè)設(shè)計(jì)(論文)主要內(nèi)容:主要工作:負(fù)責(zé)程序各個(gè)功能的整合、調(diào)試及運(yùn)行三.計(jì)劃進(jìn)度:階段工作程序和要求完成時(shí)間前期準(zhǔn)備階段學(xué)習(xí)畢業(yè)設(shè)計(jì)管理規(guī)定并準(zhǔn)備與測試有關(guān)的資料09.10.19中期指導(dǎo)檢查階段1.需求分析階段及建立軟件及硬件環(huán)境條件。分析設(shè)計(jì)任務(wù)書的要求和用戶需求,進(jìn)行可行性分析和需求分析,確定系統(tǒng)所需的模版,安裝建立設(shè)計(jì)所需軟硬件環(huán)境;素材采集,處理09.10.20-09.10.302.在確定的模版上,對(duì)系統(tǒng)功能進(jìn)行分工,進(jìn)行相關(guān)程序設(shè)計(jì),根據(jù)用戶的使用反饋結(jié)果修正自己的設(shè)計(jì)方案,在解決了大部分的bug后,可以將系統(tǒng)進(jìn)行打包。09.11.02-09.11.043.進(jìn)行軟件的性能測試,09.11.04-09.11.064.編寫測試腳本,并對(duì)測試結(jié)果進(jìn)行分析a.編寫測試腳本b.對(duì)測試結(jié)果進(jìn)行分析09.11.09-09.11.13后期答辯總結(jié)階段1.編寫畢業(yè)論文a.學(xué)習(xí)書寫畢業(yè)論文規(guī)范b.查找與所要寫的論文有關(guān)資料c.根據(jù)論文書寫規(guī)范編寫論文d.給指導(dǎo)老師審查并修改09.11.16-09.11.262.交畢業(yè)設(shè)計(jì)09.11.273.準(zhǔn)備答辯09.11.27四.畢業(yè)設(shè)計(jì)(論文)結(jié)束應(yīng)提交的材料:1、測試計(jì)劃2、測試腳本3、測試報(bào)告4、畢業(yè)論文指導(dǎo)教師教研室主任年月日 年月日論文真實(shí)性承諾及指導(dǎo)教師聲明學(xué)生論文真實(shí)性承諾本人鄭重聲明:所提交的作品是本人在指導(dǎo)教師的指導(dǎo)下,獨(dú)立進(jìn)行研究工作所取得的成果,內(nèi)容真實(shí)可靠,不存在抄襲、造假等學(xué)術(shù)不端行為。除文中已經(jīng)注明引用的內(nèi)容外,本論文不含其他個(gè)人或集體已經(jīng)發(fā)表或撰寫過的研究成果。對(duì)本文的研究做出重要貢獻(xiàn)的個(gè)人和集體,均已在文中以明確方式標(biāo)明。如被發(fā)現(xiàn)論文中存在抄襲、造假等學(xué)術(shù)不端行為,本人愿承擔(dān)本聲明的法律責(zé)任和一切后果。畢業(yè)生簽名: 日期:指導(dǎo)教師關(guān)于學(xué)生論文真實(shí)性審核的聲明本人鄭重聲明:已經(jīng)對(duì)學(xué)生論文所涉及的內(nèi)容進(jìn)行嚴(yán)格審核,確定其內(nèi)容均由學(xué)生在本人指導(dǎo)下取得,對(duì)他人論文及成果的引用已經(jīng)明確注明,不存在抄襲等學(xué)術(shù)不端行為。指導(dǎo)教師簽名: 日期: 摘要本文對(duì)圖形圖像處理系統(tǒng)的發(fā)展現(xiàn)狀和所采用的主要技術(shù)進(jìn)行了詳細(xì)分析,確定了相應(yīng)的結(jié)構(gòu)和主要功能,以及實(shí)際開發(fā)中所采取的技術(shù)。系統(tǒng)在WindowsXP平臺(tái)下實(shí)現(xiàn),本課題是采用VisualC++作為編程工具,采用面向?qū)ο蟮某绦蛟O(shè)計(jì)技術(shù)實(shí)現(xiàn)一個(gè)圖形繪制和圖像處理的應(yīng)用軟件。主要工作分為三類,包括基本圖形繪制與編輯、簡單的圖像處理、圖像格式的轉(zhuǎn)換。圖形方面主要是設(shè)計(jì)圖形基類,以及繼承圖形基類的具體圖形類。通過對(duì)獨(dú)立功能的封裝,可以為今后需要的圖形圖像的應(yīng)用奠定基礎(chǔ)。系統(tǒng)的優(yōu)點(diǎn)有:充分體現(xiàn)了面向?qū)ο蟮脑O(shè)計(jì)思想,充分運(yùn)用了C++的特性。程序結(jié)構(gòu)清晰,可讀性好,程序中做了充分的注釋。最后,對(duì)系統(tǒng)進(jìn)行測試表明,系統(tǒng)功能達(dá)到了預(yù)期的要求,界面友好,操作簡便,運(yùn)行也較穩(wěn)定,是一個(gè)完成基本功能的圖形圖像系統(tǒng)??傮w上,本文介紹了系統(tǒng)開發(fā)設(shè)計(jì)的全過程和設(shè)計(jì)過程中部分代碼,對(duì)系統(tǒng)中采用的關(guān)鍵技術(shù)也作了一些必要的說明,對(duì)圖像變換的基本原理,圖像處理的基本原理和各種圖像格式做了詳細(xì)的闡述。關(guān)鍵詞:圖像處理系統(tǒng),圖像顯示,圖片格式轉(zhuǎn)換。AbstractThisarticlehascarriedonthedetailedanalysisaboutgraphimageprocessingsystemdevelopmentandusingofthekeytechnology,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.目錄摘要 IAbstract II第一章圖像處理系統(tǒng) 11.1概述 11.2系統(tǒng)分析 11.2.1需求分析 11.2.2可行性分析 11.3總體設(shè)計(jì) 11.3.1項(xiàng)目規(guī)劃 11.3.2系統(tǒng)功能架構(gòu)圖 21.4系統(tǒng)設(shè)計(jì) 31.4.1設(shè)計(jì)目標(biāo) 31.4.2開發(fā)及運(yùn)行環(huán)境 31.5技術(shù)準(zhǔn)備 31.5.1基本繪圖操作 31.5.2內(nèi)存畫布的設(shè)計(jì) 31.5.3自定義全局函數(shù) 41.5.4自定義菜單 51.5.5自定義工具欄 111.6主要功能模塊的設(shè)計(jì) 121.6.1系統(tǒng)架構(gòu)設(shè)計(jì) 121.6.2公共模塊設(shè)計(jì) 141.6.3主窗體設(shè)計(jì) 14參考文獻(xiàn): 18致謝 19第一章圖像處理系統(tǒng)1.1概述圖像處理技術(shù)一直是困擾VisualC++初學(xué)者的一個(gè)難題,在VisualC++中,沒有一個(gè)完善的控件能夠顯示和處理各種格式的圖像,有時(shí)用戶需要了解各種圖像的文件格式,這極大地增加了初學(xué)者的學(xué)習(xí)難度。基于此,設(shè)計(jì)一個(gè)圖像處理軟件。1.2系統(tǒng)分析1.2.1需求分析通過調(diào)查,要求系統(tǒng)具有以下功能。顯示BMP、JPEG 、GIF等各種格式的圖像。實(shí)現(xiàn)BMP與JPEG、GIF圖像的批量轉(zhuǎn)換。實(shí)現(xiàn)對(duì)位圖的旋轉(zhuǎn)、反色、灰度化、線性變換等各種操作。實(shí)現(xiàn)手寫數(shù)字的識(shí)別。1.2.2可行性分析為了降低程序開發(fā)的難度,使用微軟公司的GDI+。GDI+又稱為GDIPlus,是微軟公司.NET構(gòu)架的一部分,它封裝了各種圖像的處理技術(shù)。通過使用GDI,用戶可以非常方便地實(shí)現(xiàn)圖像的顯示與轉(zhuǎn)換。雖然GDI+屬于.NET框架的一部分,但是用戶可以在非.NET環(huán)境下使用GDI+,有關(guān)具體的使用方法,在以下部分進(jìn)行介紹。1.3總體設(shè)計(jì)1.3.1項(xiàng)目規(guī)劃圖像處理系統(tǒng)是一個(gè)典型的圖像處理軟件,它由圖像顯示、圖像轉(zhuǎn)換、圖像處理、字符識(shí)別、其他和幫助等模塊組成。圖像顯示模塊該模塊主要包括顯示位圖、顯示JPEG、顯示GIF3個(gè)部分。圖像轉(zhuǎn)換模式該模塊主要包括位圖轉(zhuǎn)換為JPEG、JPEG轉(zhuǎn)換為位圖、位圖轉(zhuǎn)換為GIF、GIF轉(zhuǎn)換為位圖4個(gè)部分。圖像處理模塊該模塊主要包括圖像旋轉(zhuǎn)、圖像銳化處理、圖像反色處理、灰度化處理、線性變換5個(gè)部分。字符識(shí)別模塊該模塊主要包括手寫數(shù)字識(shí)別。其他模塊該模塊主要包括設(shè)置菜單的固定顏色和隨機(jī)顏色兩個(gè)部分。幫助模塊該模塊主要包括軟件的版本、開發(fā)單位等信息。1.3.2系統(tǒng)功能架構(gòu)圖圖像處理系統(tǒng)圖像顯示模塊圖像處理系統(tǒng)圖像顯示模塊圖像轉(zhuǎn)換模塊圖像處理模塊字符識(shí)別模塊幫助固定顏色隨機(jī)顏色關(guān)于顯示JPEG顯示GIF顯示位圖JPEG轉(zhuǎn)換位圖位圖轉(zhuǎn)換GIFGIF轉(zhuǎn)換位圖圖像旋轉(zhuǎn)圖像銳化處理圖像反色處理灰度化處理線性變換手寫數(shù)字識(shí)別其他圖1.1圖像處理系統(tǒng)功能架構(gòu)圖1.4系統(tǒng)設(shè)計(jì)1.4.1設(shè)計(jì)目標(biāo)本系統(tǒng)屬于小型的圖像處理軟件,主要用于實(shí)現(xiàn)圖像的顯示與批量轉(zhuǎn)換操作。具體設(shè)計(jì)要求如下。實(shí)現(xiàn)各種圖像格式的顯示。系統(tǒng)采用良好的人機(jī)對(duì)話模式,界面設(shè)計(jì)美觀、友好。支持圖像的單一轉(zhuǎn)換與批量轉(zhuǎn)換。實(shí)現(xiàn)位圖的各種常規(guī)操作。例如圖像旋轉(zhuǎn)、灰度化處理、線性變換等。系統(tǒng)運(yùn)行穩(wěn)定、安全可靠。1.4.2開發(fā)及運(yùn)行環(huán)境系統(tǒng)開發(fā)平臺(tái):VisualC++6.0。運(yùn)行平臺(tái):WindowsXP/Windows2000/Windows2003。分辨率:最佳效果1024*1280像素。1.5技術(shù)準(zhǔn)備1.5.1基本繪圖操作繪圖操作通常是指在窗口的某個(gè)區(qū)域輸出位圖圖像。窗口通常關(guān)聯(lián)一個(gè)設(shè)備上下文CDC,所有的繪圖操作都是通過CDC來完成的。用戶可以通過調(diào)用窗口類的GetDC方法獲得一個(gè)CDC對(duì)象指針。CDC提供BitBlt、StretchBlt等方法來輸出位圖,但是這些方法均需要借助另一個(gè)CDC對(duì)象來實(shí)現(xiàn)。如何設(shè)置源設(shè)備上下文,并調(diào)用BitBit方法輸出位圖。CDC*Pdc=GetDC();//獲取窗口設(shè)備的上下文CBitmapbk;//定義位圖對(duì)象CDCmemdc;//定義設(shè)備上下文memdc.CreateCompatibleDC(pDC);//創(chuàng)建一個(gè)兼容的設(shè)備上下文bk.LoadBitmap(IDB_CHESSBOARD);//加載位圖對(duì)象memdc.SelectObject(&bk);//選中位圖pDC->BitBlt(0,600,600,&memdc,0,0,SRCCOPY);//調(diào)用BitBlt方法輸出位圖1.5.2內(nèi)存畫布的設(shè)計(jì)在繪制圖像時(shí),如果頻繁的進(jìn)行多次繪圖操作,會(huì)出現(xiàn)閃爍的情況。為了防止閃爍的出現(xiàn),可以設(shè)計(jì)一個(gè)臨時(shí)的畫布,稱之為內(nèi)存畫布,讓所有的繪圖操作均在內(nèi)存畫布上進(jìn)行,然后在內(nèi)存畫布對(duì)象失去作用域時(shí)將其輸出到目標(biāo)設(shè)備上下文中,這樣就阻止了閃爍情況的出現(xiàn),內(nèi)存畫布的設(shè)計(jì)代碼如下:m_pbmp->CreateCompatibleBitmap(Pdc,rect.Width(),rect,Height());m_poldbmp=SelectObject(m_bmp);//選中位圖對(duì)象m_Pdc=PdC;//設(shè)置成員變量m_Rect=rect;//設(shè)置成員變量//將目標(biāo)區(qū)域繪制在內(nèi)存畫布上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);//選中之前選中的對(duì)象If(m_pbmp!=NULL)//判斷位圖對(duì)象是否為空deletem_pbmp;//釋放位圖對(duì)象DelectObject(this);//釋放設(shè)備上下文內(nèi)存畫布CMemDC只包含一個(gè)構(gòu)造函數(shù)和析構(gòu)函數(shù),其中,在構(gòu)造函數(shù)部分,將根據(jù)參數(shù)pDC創(chuàng)建一個(gè)兼容的設(shè)備上下文,并且將pDC的內(nèi)容繪制在內(nèi)存畫布上;在析構(gòu)函數(shù)中,會(huì)將內(nèi)存畫布的內(nèi)容輸出到目標(biāo)設(shè)備的上下文中。1.5.3自定義全局函數(shù)在VisualC++中沒有提供直接的函數(shù)用于獲取文件的名稱(去除擴(kuò)展名)和獲取文件的擴(kuò)展名(去除文件名)。為此,定義了兩個(gè)全局函數(shù)來獲取文件的名稱和文件擴(kuò)展名。函數(shù)定義如下:CStringExtractFileName(CString&str)//獲取文件名稱{intpos=str.ReverseFind(‘.’)}//反向查找“.”的位置returnstr.Left(pos);//從左方開始截取字符串,并返回截取的字符串}CStringGetFileExtendedName(CString&strFile)//獲取文件擴(kuò)展名{intpos=strFile.ReverseFind(‘.’);//反向查找“.”的位置returnstrFile.Right(strFile.GetLength()-pos-1)}菜單欄高度在為本系統(tǒng)設(shè)計(jì)自定義菜單時(shí),由于主界面對(duì)話框的寬度可以調(diào)整,導(dǎo)致菜單欄的高度會(huì)發(fā)生變化,如圖1.2所示。菜單欄高度圖1.2菜單欄高度從1.2中可以發(fā)現(xiàn),當(dāng)對(duì)話框的寬度變化時(shí),菜單欄的高度也會(huì)發(fā)生變化,這在繪制菜單的背景顏色時(shí)候會(huì)帶來困難,需要從user32.dll動(dòng)態(tài)鏈接庫中導(dǎo)出該函數(shù)。流程圖如下:hModule址void*pVoid=(void*)GetProcAddress(hModule,"GetMenuBarInfo");pVoidhModule址void*pVoid=(void*)GetProcAddress(hModule,"GetMenuBarInfo");pVoid數(shù)((FunGetMenuInfo)pVoid)(hwnd,idObject,::FreeLibrary(hModule);資源::FreeLibrary(hModule);資源NYNYHMODULEhModule=::LoadLibrary("user32.dll");1.5.4自定義菜單為了使程序界面更加美觀,在本系統(tǒng)中自定義了一個(gè)菜單,實(shí)現(xiàn)菜單的特殊效果顯示,如圖1.3所示:圖1.3自定義菜單在VisualC++中,實(shí)現(xiàn)自定義菜單是比較容易的,MFC類庫提供了CMenu類用于設(shè)計(jì)菜單,用戶只要從該類派生一個(gè)子類,然后改寫MeasureItem方法,設(shè)置菜單項(xiàng)的高度和寬度;改寫DrawItem方法,根據(jù)菜單項(xiàng)的不同狀態(tài),繪制不同效果的菜單項(xiàng)就可以了。具體設(shè)計(jì)如下:從CMenu類派生一個(gè)子類CCustomMenu。定義一個(gè)菜單項(xiàng)結(jié)構(gòu)CMenuItem,記錄菜單項(xiàng)的信息。代碼如下://定義一個(gè)結(jié)構(gòu),記錄菜單項(xiàng)的詳細(xì)信息StructCMenuItem{CStringm_Menutext;//菜單項(xiàng)的文本UINTm_ImageIndex;//菜單項(xiàng)圖像索引Intm_MenuType;//菜單項(xiàng)的類型-2:頂層菜單,-1:彈出式菜單,0:分隔條,其他:普通菜單向CCustomMenu類中添加成員變量。在CCustomMenu類的構(gòu)造函數(shù)中初始化成員變量。CCustomMenu::CCustomMenu(){ m_ItemCount=0;//初始化菜單項(xiàng)數(shù)量 m_Index=0;//初始化整型變量 m_MenuList=NULL;//初始化菜單列表 m_BkColor=RGB(204,199,186);//初始化背景顏色 m_SelTopColor=RGB(193,210,238);//初始化頂層菜單顏色 m_RandColor=FALSE;//是否采用隨機(jī)顏色}在CCustomMenu類的析構(gòu)函數(shù)中釋放成員變量占據(jù)的堆空間。CCustomMenu::~CCustomMenu(){if(m_ItemCount>0)//如果菜單項(xiàng)>0,則釋放菜單列表delete[]m_MenuList;}向CCustomMenu類中添加GetAllItemCount方法,獲取菜單項(xiàng)的數(shù)量,當(dāng)前流程圖如下:pMenuCMenu*pMenu=CMenu::FromHandle(hMenu);intemcount=0Multii++i<countinti=0intcount=pMenu->GetMenuItemCount();FirstFindpMenuCMenu*pMenu=CMenu::FromHandle(hMenu);intemcount=0Multii++i<countinti=0intcount=pMenu->GetMenuItemCount();FirstFindNNNYYYNNNYYY向CCustomMenu類中添加AttachMenu方法,附加菜單句柄到CCustomMenu類對(duì)象上BOOLCCustomMenu::AttatchMenu(HMENUhMenu){ Attach(hMenu);//附加菜單句柄到菜單對(duì)象 GetAllItemCount(hMenu,m_ItemCount);//獲取菜單項(xiàng)的數(shù)量 if(m_ItemCount>0)//判斷菜單項(xiàng)數(shù)量是否>0 m_MenuList=newCMenuItem[m_ItemCount];//創(chuàng)建菜單列表 returnTRUE;}(8)向CCustomMenu類中添加SetMenuItemInfo方法,將每個(gè)菜單項(xiàng)關(guān)聯(lián)一個(gè)CMenuItem結(jié)構(gòu)對(duì)象。(9)向CCustomMenu類中添加GetTopMenuWidth方法,獲取頂層菜單的高度。流程圖如下:intCount=GetMenuItemCount()i<Count::GetMenuItemRect(AfxGetMainWnd()->m_hWnd,m_hMenu,i,rc);i++returnwidth;intCount=GetMenuItemCount()i<Count::GetMenuItemRect(AfxGetMainWnd()->m_hWnd,m_hMenu,i,rc);i++returnwidth;NYinti=0//獲取菜單欄中非菜單項(xiàng)區(qū)域HRGNCCustomMenu::GetClientMenuRgn()MENUBARINFOMenuInfo;//定義菜單項(xiàng)信息對(duì)象memset(&MenuInfo,0,sizeof(MENUBARINFO));//初始化菜單項(xiàng)信息MenuInfo.cbSize=sizeof(MENUBARINFO);//設(shè)置菜單項(xiàng)信息結(jié)構(gòu)的大小GetMenuBarInfo(AfxGetMainWnd()->m_hWnd,OBJID_MENU,0,&MenuInfo);CRectrc=MenuInfo.rcBar;//獲取菜單欄的區(qū)域intMenuCount=GetMenuItemCount();//獲取頂層菜單的數(shù)量CRect*pRC=newCRect[MenuCount];//定義一個(gè)區(qū)域指針,記錄菜單項(xiàng)區(qū)域HRGN*pRgn=newHRGN[MenuCount];//定義一個(gè)選區(qū)指針,記錄菜單項(xiàng)選區(qū)CRectwinRC;//定義一個(gè)區(qū)域?qū)ο驛fxGetMainWnd()->GetWindowRect(winRC);//獲取主窗口區(qū)域HRGNretRgn=CreateRectRgn(0,0,0,0);HRGNMenuClientRgn=CreateRectRgn(0,0,0,0);for(intj=0;j<MenuCount;j++)//組合菜單項(xiàng)的區(qū)域//去除菜單欄中菜單項(xiàng)的區(qū)域,以獲取非菜單項(xiàng)區(qū)域CombineRgn(retRgn,MenuRgn,MenuClientRgn,RGN_DIFF);for(j=0;j<MenuCount;j++) i<MenuCounti<MenuCounti<MenuCountinWnd()->m_hWi++HRGNMenuRgn=CreateRectRgn(rc.left,rc.top,rc.right,rc.bottom);Rgn(rc.left,rc.top,rintj=0CombineRgn(MenuClientRgn,MenuClientRgn,pRgn[j],RGN_OR);CombineRgn(MenuClientRgn,MenuClientRgn,,以獲取非菜單項(xiàng)區(qū)域j++Sidebysidej<MenuCountNYNYinti=0MENUBARINFOMenuInfo;(11)向CCustomMenu類中添加SetMenuItemText方法,繪制菜單項(xiàng)文本。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方法,繪制菜單項(xiàng)的背景顏色。voidCCustomMenu::DrawMenuBk(CDC*pDC,CRectRect,COLORREFSrcColor,COLORREFDesColor,BOOL{ if(State) { pDC->Rectangle(Rect); Rect.DeflateRect(1,1); intr1,g1,b1; //讀取漸變起點(diǎn)的顏色值 r1=GetRValue(SrcColor); g1=GetGValue(SrcColor); b1=GetBValue(SrcColor); intr2,g2,b2; //讀取漸變終點(diǎn)的顏色值 r2=GetRValue(DesColor); g2=GetGValue(DesColor); b2=GetBValue(DesColor); floatr3,g3,b3; //菜單區(qū)域水平方向每個(gè)點(diǎn)RGB值應(yīng)該變化的度(范圍) r3=((float)(r2-r1))/(float)(Rect.Height()); g3=(float)(g2-g1)/(float)(Rect.Height()); b3=(float)(b2-b1)/(float)(Rect.Height()); COLORREFr,g,b; //菜單區(qū)域水平方向每個(gè)點(diǎn)的顏色值 CPen*pOldPen; for(inti=Rect.top;i<Rect.bottom;i++) { r=r1+(int)r3*(i-Rect.top); g=g1+(int)g3*(i-Rect.top); b=b1+(int)b3*(i-Rect.top); CPenpen(PS_SOLID,1,RGB(r,g,b)); pOldPen=pDC->SelectObject(&pen); pDC->MoveTo(Rect.left,i); pDC->LineTo(Rect.right,i); pDC->SelectObject(pOldPen); } } else { pDC->FillSolidRect(Rect,RGB(0x000000F9,0x000000F8,0x000000F7)); }}(15)改寫菜單類的MeasureItem虛方法,根據(jù)菜單項(xiàng)的文本設(shè)置菜單項(xiàng)的寬度。lpStruct->itemWidth=size.cx+25;//設(shè)置菜單項(xiàng)的寬度(16)改寫菜單類的DrawItem虛方法,根據(jù)菜單項(xiàng)的不同狀態(tài),繪制不同效果的菜單。unsignedintm_state=lpStruct->itemState;//獲取菜單項(xiàng)的狀態(tài)CDC*pDC=CDC::FromHandle(lpStruct->hDC);//獲取菜單設(shè)備上下文CStringstr=((CMenuItem*)(lpStruct->itemData))->m_MenuText;//獲取菜單各項(xiàng)的文本intMenuID=((CMenuItem*)(lpStruct->itemData))->m_MenuType;//獲取菜單類型CRectRect=lpStruct->rcItem;//獲取菜單項(xiàng)區(qū)域pDC->SetBkMode(TRANSPARENT);//設(shè)置透明的背景模式switch(MenuID)//判斷菜單類型1.5.5自定義工具欄在本系統(tǒng)中為了使程序主界面更加美觀,自定義了一個(gè)工具欄,效果如圖1.4 所示。圖1.4自定義工具欄自定義工具欄最簡單的方法是處理NM_CUSTOMDRAW消息,在其消息處理函數(shù)中根據(jù)工具欄按鈕的不同狀態(tài)繪制不同效果的工具欄按鈕。具體設(shè)計(jì)步驟如下。從CToolBar類派生一個(gè)子類,本例為CCustomBar。向CCustomBar類中添加變量成員。在CCustomBar類的消息映射部分添加ON_NOTIFY_REFLECT映射宏,用于處理NM_CUSTOMRAW消息。向CCustomBar類中添加OnOwnerDraw方法,表示NM_CUSTOMDRAW消息的處理方法,用于繪制工具欄按鈕。向CCustomBar類中添加DrawButton方法,根據(jù)工具欄按鈕的不同狀態(tài),繪制不同效果的工具欄按鈕。1.6主要功能模塊的設(shè)計(jì)1.6.1系統(tǒng)架構(gòu)設(shè)計(jì)為了使讀者能夠?qū)ο到y(tǒng)文件有更清晰的認(rèn)識(shí)并了解其使用方法,在此設(shè)計(jì)了文件架構(gòu)圖,如圖1.5所示。CMainFrame(系統(tǒng)主界面) 像圖像顯示圖像轉(zhuǎn)換圖像處理字符識(shí)別幫助圖1.5主文件架構(gòu)圖圖像顯示文件架構(gòu)圖和圖像轉(zhuǎn)換文件架構(gòu)如圖1.6和圖1.7所示。CShowImageCShowImage顯示位圖CShowJPEG顯示JPEGCShowGIF顯示GIF圖像顯示圖1.6圖像顯示文件架構(gòu)圖CBmpToJpegCBmpToJpeg位圖轉(zhuǎn)換為JPEGCJpegToBmpJPEG轉(zhuǎn)換為位圖CBmpToGif位圖轉(zhuǎn)換為GIF圖像轉(zhuǎn)換CGifToBmpGIF轉(zhuǎn)換為位圖圖1.7圖像轉(zhuǎn)換文件架構(gòu)圖圖像處理文件架構(gòu)圖和字符識(shí)別文件架構(gòu)圖如圖1.8和1.9所示。幫助文件架構(gòu)圖如圖1.10所示。CRotationImageCRotationImage 圖像旋轉(zhuǎn)CBmpSharp圖像銳化處理CReverseColor圖像反色處理圖像處理CGrayHandle灰度化處理CLineArity線性變換圖1.8圖像處理文件架構(gòu)圖 字符識(shí)別CRecNumber幫助CAboutDlg手寫數(shù)字識(shí)別關(guān)于圖1.9字符識(shí)別文件架構(gòu)圖圖1.10幫助文件架構(gòu)圖1.6.2公共模塊設(shè)計(jì)在設(shè)計(jì)圖像效果顯示時(shí),有些圖像可能比較大,在窗口中不能完全顯示出來。為了讓用戶能夠?yàn)g覽圖像,可以單獨(dú)設(shè)計(jì)了一個(gè)滾動(dòng)窗口,當(dāng)控件設(shè)置在窗口中,用戶可以通過滾動(dòng)條來瀏覽控件的各個(gè)部分。滾動(dòng)窗口的設(shè)計(jì)步驟如下。(1)創(chuàng)建一個(gè)對(duì)話框,類名為“CImageContainer”,設(shè)置對(duì)話框的屬性。(2)處理對(duì)話框的WM_HSCROLL消息,設(shè)置窗口的滾動(dòng)方向和范圍。代碼如下:(3)處理對(duì)話框的VSCROLL消息,設(shè)置窗口的滾動(dòng)方向和范圍。代碼如下:caseSB_PAGELEFT://在滾動(dòng)塊的左方空白滾動(dòng)區(qū)域單擊,增量為6caseSB_PAGERIGHT://在滾動(dòng)塊的右方空白滾動(dòng)區(qū)域單擊,增量為6(4)處理對(duì)話框的WM_MOUSEWHEEL消息,響應(yīng)鼠標(biāo)的滾輪事件。代碼如下:GetScrollInfo(SB_VERT,&vinfo);//獲取滾動(dòng)條信息intmin,max,thumbwidth; min=vinfo.nMin; max=vinfo.nMax; thumbwidth=vinfo.nPage; intpos=GetScrollPos(SB_VERT);//獲取垂直滾動(dòng)條位置 SetScrollPos(SB_VERT,pos-6);//設(shè)置垂直滾動(dòng)條的位置 ScrollWindow(0,6);//滾動(dòng)窗口1.6.3主窗體設(shè)計(jì)1.實(shí)現(xiàn)目標(biāo)圖像處理系統(tǒng)主窗體主要由菜單、工具欄、客戶區(qū)域和狀態(tài)欄4部分組成,主要功能是對(duì)圖像處理系統(tǒng)的各個(gè)模塊進(jìn)行調(diào)整。圖像處理系統(tǒng)主窗體的運(yùn)行效果如圖1.11所示。1.11圖像處理系統(tǒng)主窗體的運(yùn)行效果2.設(shè)計(jì)步驟(1)創(chuàng)建一個(gè)單文檔/視圖結(jié)構(gòu)的應(yīng)用程序,工程名稱為“ImageHandle”。(2)在工作區(qū)的資源視圖窗口中修改菜單資源ID為“IDR_MAINMENU”,設(shè)置菜單項(xiàng)的效果如圖1.12所示。圖1.12菜單資源設(shè)計(jì)菜單資源文件代碼如下:IDR_MAINMENUMENUDISCARDABLEBEGINPOPUP“圖像顯示”BEGINMENUITEM“顯示位圖”,ID_MENUSHOWBMPMENUITEM“顯示JPEG”,ID_MENUSHOWJPGMENUITEM“顯示GIF”,ID_MENUSHOWGIFENDPOPUP“圖像轉(zhuǎn)換”BEGINMENUITEM“位圖轉(zhuǎn)換為JPEG”,ID_MENUBMPTOJPEGMENUITEM“JPEG轉(zhuǎn)換為位圖”,ID_MENUJPEGTOBMPMENUITEM“位圖轉(zhuǎn)換為GIF”,ID_MENUBMPTOGIFMENUITEM“GIF轉(zhuǎn)換為位圖”,ID_MENUGIFTOBMPENDPOPUP“圖像轉(zhuǎn)換”BEGINMENUITEM“圖像旋轉(zhuǎn)”,ID_MENUROTATIONMENUITEM“圖像銳化處理”,ID_MENUBMPSHARPMENUITEM“圖像反色處理”,ID_MENUREVERSECOLORMENUITEM“灰度化處理”,ID_MENUGRAYHANDLEMENUITEM“線性變換”,ID_MENULINEARITYENDPOPUP“圖像轉(zhuǎn)換”,BEGINMENUITEM“手寫數(shù)字識(shí)別”,65535ENDPOPUP“圖像轉(zhuǎn)換”,BEGINMENUITEM“隨機(jī)顏色”,ID_RANDOMCOLORMENUITEM“固定顏色”,ID_FIXCOLORENDPOPUP“圖像轉(zhuǎn)換”,BEGINMENUITEM“關(guān)于…”,ID_ABOUTENDEND3.代碼分析(1)在應(yīng)用程序類的InitInstance方法中修改單文檔模板構(gòu)造函數(shù)的參數(shù),由于之前修改了菜單資源ID,因此構(gòu)造函數(shù)的參數(shù)應(yīng)設(shè)置為新的菜單資源ID。代碼如下:CSingleDocTemplate*pDocTemplate;pDocTemplate=newCSingleDocTemplate(IDR_MAINMENU,RUNTIME_CLASS(CImageHandleDOC),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CImageHandleView));AddDocTemplate(pDocTemplate);(2)在主窗口(框架類)的頭文件中引用自定義菜單和工具欄類的頭文件。代碼如下:#include“CustomMenu.h”#include“CustomBar.h”(3)向框架類的頭文件中添加成員變量。代碼如下:CStausBarm_wndStatusBar;CCustimBarm_wndToolBar;CImageListm_ImageList;CCustomMenum_Menu;(4)在創(chuàng)建框架窗口時(shí)創(chuàng)建菜單、工具欄和狀態(tài)欄。代碼和流程圖如下:m_wndToolBar.SetButtonText(0,"顯示位圖");m_wndToolBar.SetButtonText(1,"顯示JPEG");m_wndToolBar.SetButtonText(2,"顯示GIF");m_wndToolBar.SetButtonText(4,"位圖轉(zhuǎn)換JPEG");m_wndToolBar.SetButtonText(5,"JPEG轉(zhuǎn)換位圖");m_wndToolBar.SetButtonText(6,"位圖轉(zhuǎn)換GIF");m_wndToolBar.SetButtonText(7,"GIF轉(zhuǎn)換位圖");m_wndToolBar.SetButtonText(9,"圖像旋轉(zhuǎn)");m_wndToolBar.SetButtonText(10,"線性變換"); YYYNNlpCreateStruct->hMenu=LoadMenu(AfxGetResourceHandle(),MAKEINTRESOURCE(lpCreateStruct));return-1;!m_wndStatusBar.Create(this)||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT))m_ImageList.Create(30,25,ILC_COLOR32|ILC_MASK,1,1);TRACE0("Failedtocreatestatusbar\n");CFrameWnd::OnCreate(lpCreateStruct)==-1SideBySide(5)在視圖類的OnDraw方法中繪制背景圖像。代碼如下: CImageHandleDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); ::SetWindowText(GetParent()->m_hWnd,"圖像處理軟件"); CBitmapbmp;//定義位圖對(duì)象 bmp.LoadBitmap(IDB_MAINBMP);//加載位圖 CDCmemDC; memDC.CreateCompatibleDC(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論