基于VB與VC編程技術(shù)的位圖圖像處理系統(tǒng)的開發(fā).doc_第1頁
基于VB與VC編程技術(shù)的位圖圖像處理系統(tǒng)的開發(fā).doc_第2頁
基于VB與VC編程技術(shù)的位圖圖像處理系統(tǒng)的開發(fā).doc_第3頁
基于VB與VC編程技術(shù)的位圖圖像處理系統(tǒng)的開發(fā).doc_第4頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

基于VB與VC編程技術(shù)的位圖圖像處理系統(tǒng)的開發(fā) 摘要 結(jié)合VB與VC編程技術(shù)的優(yōu)點(diǎn),可開發(fā)出快速、高效的位圖圖像處理系統(tǒng)。介紹了在VB中通過調(diào)用API函數(shù)快速獲取位圖圖像像素信息和顯示位圖圖像的方法,說明了VC中編寫DLL及在VB中調(diào)用的過程。關(guān)鍵詞 VB,VC,DLL, API函數(shù)Development Of Bitmap Graphics Processing System Based ON Programming Technology Of VB and VCAbstract IT can develop Bitmap Graphics processing system rapidly and efficiently that combines the advantage of programming technology with VB and VC. The paper introduces the method of obtaining information of Bitmaps pixels and displaying Bitmap Graphics, through calling of Windows API function in VB, explains the process of DLL programming in VC and calling in VB.Key words VB, VC, DLL, API function 1、 引言位圖圖像又稱點(diǎn)陣圖像,是由許多不同顏色的點(diǎn)組成的,這些點(diǎn)被稱為像素。在計(jì)算機(jī)處理位圖時(shí),需要進(jìn)行大量的數(shù)值計(jì)算,像素越高,分辯率越高,計(jì)算量就越大,圖像處理的速度就越慢。以在圖像處理中常用的模板處理為例,對(duì)于一幅模板為N*N的圖像,就要進(jìn)行9(N-2)2次乘法,8(N-2)2次加法操作,算法復(fù)雜度為O(N2),運(yùn)算量非常之大。鑒于此,筆者認(rèn)為可利用VB與VC編程技術(shù)上各自的優(yōu)點(diǎn)來開發(fā)出一種快速、高效的位圖圖像處理系統(tǒng)。VB在界面編程中具有所見即所得的優(yōu)勢,且編程快速、簡單,但代碼運(yùn)行較慢。VC編寫的程序,編譯后代碼的執(zhí)行速度比VB快,但編程較為復(fù)雜。因此,位圖圖像處理系統(tǒng)的開發(fā),對(duì)于系統(tǒng)界面等不涉及大量數(shù)值計(jì)算的程序可利用VB的優(yōu)勢來編程,對(duì)于位圖圖像處理等涉及大量數(shù)值計(jì)算的程序可利用VC的優(yōu)勢來編程。可采用在VB中調(diào)用VC編寫的DLL(動(dòng)態(tài)鏈接庫)的方法,就能實(shí)現(xiàn)VB與VC的優(yōu)化組合,這樣開發(fā)出的位圖圖像處理系統(tǒng)不僅能提高編程的效率,同時(shí)也能保證處理位圖圖像速度。以下介紹開發(fā)過程:2、 VB中調(diào)用DLL的實(shí)現(xiàn)DLL(Windows API是一種典型的DLL庫)是一種包含了一些函數(shù)和例程的可執(zhí)行文件,其本身并不能單獨(dú)運(yùn)行,但可為其它應(yīng)用程序提供服務(wù)。在VB中調(diào)用DLL時(shí),必須首先告訴VB如何正確地向DLL例程傳遞函數(shù),可使用Declare語句對(duì)DLL中的例程進(jìn)行聲明,Declare語句的語結(jié)構(gòu)有如下兩種:Public/Private Declare Sub name Lib “l(fā)ibname” Alias “aliasname” (arghlist)Public/Private Declare Function name Lib “l(fā)ibname” Alias “aliasname” (arghlist) as type如果一個(gè)DLL過程沒有返回值,就應(yīng)該被聲明為子過程的形式,即采用前一種語法結(jié)構(gòu);如果一個(gè)DLL過程返回了一個(gè)可用于表達(dá)式的值,則應(yīng)被聲明為函數(shù)的形式,即采用后一種語法結(jié)構(gòu)。在類模塊或窗體模塊中的DLL過程只能被聲明為Private,并只能在模塊中使用。在標(biāo)準(zhǔn)模塊中,只能聲明為Public,且這個(gè)DLL過程能為工程中所有的模塊訪問。其中name指明了過程名,其命名需遵循VB命名規(guī)則。Lib子句指明了包含所聲明過程的動(dòng)態(tài)鏈接庫或代碼資源,該動(dòng)態(tài)鏈接庫或代碼資源由libname指定,如果后綴名為“.dll”,則可以省略。如果libname沒有指定路徑名,VB會(huì)按如下規(guī)則進(jìn)行搜索:.exe文件所在目錄。當(dāng)前目錄。Windows系統(tǒng)目錄。Windows目錄。Path環(huán)境變量中的目錄。VB在傳遞參數(shù)時(shí)有兩種方式,按值的方式(Byval)和按引用的方式(ByRef)傳遞。按值的方式傳遞時(shí),傳遞的實(shí)際上是變量的一個(gè)副本,接受該參數(shù)的過程所作的改變只針對(duì)該副本,不會(huì)影響變量本身。按引用的方式傳遞是VB6的默認(rèn)方式。在這種方式中,實(shí)際上傳遞的并不是變量的值,而是指向這個(gè)變量的32位地址。所調(diào)用的過程根據(jù)這個(gè)地址來獲取變量的實(shí)際值。這樣過程可以通過對(duì)地址中的值的修改來達(dá)到永久修改參數(shù)原有值的目的。C/C+的數(shù)據(jù)類型與VB的數(shù)據(jù)類型并不相同。在VB中調(diào)用C 或C+編寫的DLL,需要知道兩者數(shù)據(jù)類型之間的對(duì)應(yīng)關(guān)系,如表1所示。當(dāng)然,并不是兩者之間所有的數(shù)據(jù)類型都能找到對(duì)應(yīng)關(guān)系。聲明了過程后,就可以使用該過程名name訪問該過程。表1 C中數(shù)據(jù)類型與聲明DLL過程所用參數(shù)格式的對(duì)應(yīng)關(guān)系C中的數(shù)據(jù)類型VB里Declare中使用的參數(shù)聲明格式C中的數(shù)據(jù)類型VB里Declare中使用的參數(shù)聲明格式BOOLByVal variable as longBYTEByVal variable as byteCHARByVal variable as byteDWORDByVal variable as longHWND,HDC等Windows句柄ByVal variable as longINT,UNITByVal variable as longLONGByVal variable as longLPDWORDByVal variable as longLPINT,LPUNITByVal variable as longLPVOIDByVal variable as anyNULLAs any 或ByVal variable as longSHORTByVal variable as IntegerWORDByVal variable as IntegerLPWORDByVal variable as Integer3、 VB中獲取位圖的像素信息和顯示位圖的實(shí)現(xiàn)為了在VB中快速地獲取像素信息和顯示位圖,需要使用三個(gè)API函數(shù)??梢岳肁PI函數(shù)GetObject獲取位圖格式信息;用GetBitmapBits獲取位圖的像素信息;用SetBitmapBits將像素信息返回給位圖并顯示出來。31 GetObject函數(shù)在VB中的聲明如下:Public/Private Declare Function GetObject Lib “gdi32” Alias “GetObjectA” (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As LonghObject是圖像對(duì)象(位圖、畫筆、刷子、字體、調(diào)色板等)的句柄,nCount是接受對(duì)應(yīng)圖像對(duì)象信息的結(jié)構(gòu)的字節(jié)數(shù),lpObject是指向接受對(duì)應(yīng)圖像信息的結(jié)構(gòu)的指針。如果是位圖,hObject是位圖的句柄,而接受圖像信息的結(jié)構(gòu)為BITMAP,其定義如下:Public/Private Type BITMAP 14 bytesbmType As LongbmWidth As LongbmHeight As LongbmWidthBytes As LongbmPlanes As IntegerbmBitsPixel As IntegerbmBits As LongEnd Type其中BmType指明了位圖的類型,這個(gè)值必須是0;bmWidth代表位圖以像素為單位的圖像寬度;bmHeight代表位圖以像素為單位的圖像高度;bmWidthBytes指明了每個(gè)掃描行的字節(jié)數(shù)(即以字節(jié)為單位的圖像寬度),這個(gè)值必須可被2整除;bmPlanes代表圖像的顏色面數(shù);bmBitsPixel指明每個(gè)像素用幾位數(shù)據(jù)來表示(8,16,24,32);bmBits是指向圖像數(shù)據(jù)的指針。32 GetBitmapBits和SetBitmpBits分別用于從位圖中獲取圖像中的像素信息和把像素信息返回給位圖。兩者在VB中的聲明如下:Public/Private Declare Function GetBitmapBits Lib “gdi32”Alias “GetBitmapBits” (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As LongPublic/Private Declare Function SetBitmapBits Lib “gdi32”Alias “SetBitmapBits” (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long其中hbitmap是位圖的句柄,dwCount是圖像信息的大小,lpBits是保存圖像信息的地址。33 三個(gè)API函數(shù)的用法。首先新建一個(gè)VB工程,在其中添加一個(gè)Picture Box控件Picture1,在其中加載一幅圖片。然后分別聲明以上三個(gè)API函數(shù)和BITMAP類型。最后添加下面的代碼。Dim Besult As Long, totbytes As LongDim bmp As BITMAPDim lmgArray() As ByteResult=GetObject(Picture1.Picture.handle, Len(bmp), bmp) 獲取位圖圖像格式信息totbytes=bmp.bmWidthBytes*bmp.bmHeight 總共要多多少個(gè)Byte來存圖ReDim lmgArray(totbytes)Result=GetBitmapBits(Picture1.Picture.handle, totbytes,lmgArray(0) 獲得圖片像素信息在這里加入對(duì)圖像像素?cái)?shù)據(jù)進(jìn)行處理的程序Call SetBitmapBits(Picture1.Picture.handle, totbytes,lmgArray(0) 顯示處理結(jié)果Picture1.Refresh4、 VC中編寫DLL,供VB中調(diào)用為了在VC編寫的動(dòng)態(tài)鏈接庫中處理圖像像素,需要VB把獲取的位圖圖像像素信息傳送給DLL。上文,已經(jīng)介紹了獲取像素信息的方法,這里說明的是把存有像素信息的數(shù)組傳送給DLL。由于數(shù)值型的數(shù)組在VB中其數(shù)據(jù)是連續(xù)存放的,而在C/C+中數(shù)組可以等價(jià)于指向數(shù)組第1個(gè)元素的指針。那么可以用引用的方式把VB中數(shù)組的第1個(gè)元素的地址傳給VC編寫的DLL,在DLL中用一個(gè)指針來接收,這樣就達(dá)到了傳遞數(shù)組的目的。至于從DLL傳遞數(shù)組給VB,方法相同,只不過過程相反而已。注意在這個(gè)過程中VB和VC中的數(shù)據(jù)類型一定要對(duì)應(yīng)的。同時(shí),因?yàn)樵贑/C+中并不檢查數(shù)組的界限,需要告訴DLL數(shù)組的大小。下面以對(duì)灰度圖像進(jìn)行銳化為例說明編寫和調(diào)用DLL的一般方法。先在VC中選擇新建一個(gè)MFC AppWizard(dll)項(xiàng)目,取名為Mydll,并接受下面的選項(xiàng)的默認(rèn)設(shè)置。接著在Globals項(xiàng)下添加一個(gè)新過程Myfunc,其定義如下:void_stdcall Myfunc(LPVOID PicArray, long PicHeight, long PicWidth) /PicArray是接受數(shù)組的指針,PicHeight和PicWidth分別是圖像以字節(jié)為單位的高度和寬度。 long Presult; int temple33; /定義模板數(shù)組 for (int i=0;i3;i+) /模板數(shù)組賦值 for (int j =0;j3;j+) templeij =-1; temple11=9; for (i=1;ipicHeight 2;i+) for (int j=1; jpicWidth-2;j+) PResult=0; /對(duì)像素進(jìn)行模板操作 for (int k=0; k3; k+) for(int l=0; l255) PResult=255; if (PResult0) PResult=0;*(picArray +(i 1)*picWidth +j) = (byte) PResult;在建立項(xiàng)目之前,需要在Mydll.def文件的EXPORTS項(xiàng)下加一行Myfunc。因?yàn)樵赩B的命名規(guī)則中第1個(gè)字符不允許為“-”,而VC編寫的過程,其默認(rèn)的導(dǎo)出函數(shù),會(huì)在函數(shù)名前加“-”。所以只有強(qiáng)制VC按要求命名導(dǎo)出函數(shù)。生成Mydll.dll后,將Mydll.dll復(fù)制到VB編寫的執(zhí)行文件所在的目錄。在VB中對(duì)應(yīng)聲明Myfunc過程。Private Declare Sub Myfunc Lib “mydll” (PicArray as Byte, PicHeight as Long, Pic

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論