



免費預(yù)覽已結(jié)束,剩余1頁可下載查看
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
基于VB與VC編程技術(shù)的位圖圖像處理系統(tǒng)的開發(fā) 摘要 結(jié)合VB與VC編程技術(shù)的優(yōu)點,可開發(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、 引言位圖圖像又稱點陣圖像,是由許多不同顏色的點組成的,這些點被稱為像素。在計算機處理位圖時,需要進行大量的數(shù)值計算,像素越高,分辯率越高,計算量就越大,圖像處理的速度就越慢。以在圖像處理中常用的模板處理為例,對于一幅模板為N*N的圖像,就要進行9(N-2)2次乘法,8(N-2)2次加法操作,算法復(fù)雜度為O(N2),運算量非常之大。鑒于此,筆者認(rèn)為可利用VB與VC編程技術(shù)上各自的優(yōu)點來開發(fā)出一種快速、高效的位圖圖像處理系統(tǒng)。VB在界面編程中具有所見即所得的優(yōu)勢,且編程快速、簡單,但代碼運行較慢。VC編寫的程序,編譯后代碼的執(zhí)行速度比VB快,但編程較為復(fù)雜。因此,位圖圖像處理系統(tǒng)的開發(fā),對于系統(tǒng)界面等不涉及大量數(shù)值計算的程序可利用VB的優(yōu)勢來編程,對于位圖圖像處理等涉及大量數(shù)值計算的程序可利用VC的優(yōu)勢來編程。可采用在VB中調(diào)用VC編寫的DLL(動態(tài)鏈接庫)的方法,就能實現(xiàn)VB與VC的優(yōu)化組合,這樣開發(fā)出的位圖圖像處理系統(tǒng)不僅能提高編程的效率,同時也能保證處理位圖圖像速度。以下介紹開發(fā)過程:2、 VB中調(diào)用DLL的實現(xiàn)DLL(Windows API是一種典型的DLL庫)是一種包含了一些函數(shù)和例程的可執(zhí)行文件,其本身并不能單獨運行,但可為其它應(yīng)用程序提供服務(wù)。在VB中調(diào)用DLL時,必須首先告訴VB如何正確地向DLL例程傳遞函數(shù),可使用Declare語句對DLL中的例程進行聲明,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如果一個DLL過程沒有返回值,就應(yīng)該被聲明為子過程的形式,即采用前一種語法結(jié)構(gòu);如果一個DLL過程返回了一個可用于表達式的值,則應(yīng)被聲明為函數(shù)的形式,即采用后一種語法結(jié)構(gòu)。在類模塊或窗體模塊中的DLL過程只能被聲明為Private,并只能在模塊中使用。在標(biāo)準(zhǔn)模塊中,只能聲明為Public,且這個DLL過程能為工程中所有的模塊訪問。其中name指明了過程名,其命名需遵循VB命名規(guī)則。Lib子句指明了包含所聲明過程的動態(tài)鏈接庫或代碼資源,該動態(tài)鏈接庫或代碼資源由libname指定,如果后綴名為“.dll”,則可以省略。如果libname沒有指定路徑名,VB會按如下規(guī)則進行搜索:.exe文件所在目錄。當(dāng)前目錄。Windows系統(tǒng)目錄。Windows目錄。Path環(huán)境變量中的目錄。VB在傳遞參數(shù)時有兩種方式,按值的方式(Byval)和按引用的方式(ByRef)傳遞。按值的方式傳遞時,傳遞的實際上是變量的一個副本,接受該參數(shù)的過程所作的改變只針對該副本,不會影響變量本身。按引用的方式傳遞是VB6的默認(rèn)方式。在這種方式中,實際上傳遞的并不是變量的值,而是指向這個變量的32位地址。所調(diào)用的過程根據(jù)這個地址來獲取變量的實際值。這樣過程可以通過對地址中的值的修改來達到永久修改參數(shù)原有值的目的。C/C+的數(shù)據(jù)類型與VB的數(shù)據(jù)類型并不相同。在VB中調(diào)用C 或C+編寫的DLL,需要知道兩者數(shù)據(jù)類型之間的對應(yīng)關(guān)系,如表1所示。當(dāng)然,并不是兩者之間所有的數(shù)據(jù)類型都能找到對應(yīng)關(guān)系。聲明了過程后,就可以使用該過程名name訪問該過程。表1 C中數(shù)據(jù)類型與聲明DLL過程所用參數(shù)格式的對應(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中獲取位圖的像素信息和顯示位圖的實現(xiàn)為了在VB中快速地獲取像素信息和顯示位圖,需要使用三個API函數(shù)。可以利用API函數(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是圖像對象(位圖、畫筆、刷子、字體、調(diào)色板等)的句柄,nCount是接受對應(yīng)圖像對象信息的結(jié)構(gòu)的字節(jié)數(shù),lpObject是指向接受對應(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指明了位圖的類型,這個值必須是0;bmWidth代表位圖以像素為單位的圖像寬度;bmHeight代表位圖以像素為單位的圖像高度;bmWidthBytes指明了每個掃描行的字節(jié)數(shù)(即以字節(jié)為單位的圖像寬度),這個值必須可被2整除;bmPlanes代表圖像的顏色面數(shù);bmBitsPixel指明每個像素用幾位數(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 三個API函數(shù)的用法。首先新建一個VB工程,在其中添加一個Picture Box控件Picture1,在其中加載一幅圖片。然后分別聲明以上三個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 總共要多多少個Byte來存圖ReDim lmgArray(totbytes)Result=GetBitmapBits(Picture1.Picture.handle, totbytes,lmgArray(0) 獲得圖片像素信息在這里加入對圖像像素數(shù)據(jù)進行處理的程序Call SetBitmapBits(Picture1.Picture.handle, totbytes,lmgArray(0) 顯示處理結(jié)果Picture1.Refresh4、 VC中編寫DLL,供VB中調(diào)用為了在VC編寫的動態(tài)鏈接庫中處理圖像像素,需要VB把獲取的位圖圖像像素信息傳送給DLL。上文,已經(jīng)介紹了獲取像素信息的方法,這里說明的是把存有像素信息的數(shù)組傳送給DLL。由于數(shù)值型的數(shù)組在VB中其數(shù)據(jù)是連續(xù)存放的,而在C/C+中數(shù)組可以等價于指向數(shù)組第1個元素的指針。那么可以用引用的方式把VB中數(shù)組的第1個元素的地址傳給VC編寫的DLL,在DLL中用一個指針來接收,這樣就達到了傳遞數(shù)組的目的。至于從DLL傳遞數(shù)組給VB,方法相同,只不過過程相反而已。注意在這個過程中VB和VC中的數(shù)據(jù)類型一定要對應(yīng)的。同時,因為在C/C+中并不檢查數(shù)組的界限,需要告訴DLL數(shù)組的大小。下面以對灰度圖像進行銳化為例說明編寫和調(diào)用DLL的一般方法。先在VC中選擇新建一個MFC AppWizard(dll)項目,取名為Mydll,并接受下面的選項的默認(rèn)設(shè)置。接著在Globals項下添加一個新過程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; /對像素進行模板操作 for (int k=0; k3; k+) for(int l=0; l255) PResult=255; if (PResult0) PResult=0;*(picArray +(i 1)*picWidth +j) = (byte) PResult;在建立項目之前,需要在Mydll.def文件的EXPORTS項下加一行Myfunc。因為在VB的命名規(guī)則中第1個字符不允許為“-”,而VC編寫的過程,其默認(rèn)的導(dǎo)出函數(shù),會在函數(shù)名前加“-”。所以只有強制VC按要求命名導(dǎo)出函數(shù)。生成Mydll.dll后,將Mydll.dll復(fù)制到VB編寫的執(zhí)行文件所在的目錄。在VB中對應(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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2018新人教版地理中考總復(fù)習(xí)-考綱解讀、考點分析梳理(含歷年真題)第四章 天氣和氣候
- CPBA考試中的利益相關(guān)者管理試題及答案
- 2024年小自考設(shè)計趨勢試題及答案
- 市場營銷小自考試題及答案探討
- 初二數(shù)學(xué)經(jīng)典試題及答案
- 2024年小自考視覺傳播設(shè)計分析試題
- 自考視覺表現(xiàn)的創(chuàng)新能力試題及答案
- 傳播設(shè)計與數(shù)字媒體試題及答案
- 商業(yè)分析的基本技能試題及答案
- 2025年鐵氧體粘結(jié)永磁磁粉合作協(xié)議書
- 2025年池州職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試近5年??及鎱⒖碱}庫含答案解析
- 2025年發(fā)展對象考試題庫附含答案
- 房地產(chǎn)市場報告 -銳理2024年成都房地產(chǎn)市場年報 20250110
- 中國新聞社招聘考試試卷及答案2022
- 成都中考二診數(shù)學(xué)試卷
- 創(chuàng)業(yè)思維-創(chuàng)造你喜愛的人生知到智慧樹章節(jié)測試課后答案2024年秋浙江旅游職業(yè)學(xué)院
- 朱玉賢《現(xiàn)代分子生物學(xué)》(第5版)配套題庫【考研真題+章節(jié)題庫】
- 9《屈原列傳》課件 2023-2024學(xué)年統(tǒng)編版高中語文選擇性必修中冊
- 《ISO 55013-2024 資產(chǎn)管理-數(shù)據(jù)資產(chǎn)管理指南》專業(yè)解讀和應(yīng)用指導(dǎo)材料(雷澤佳編制-2024C0)【第2部分:131-273】
- 《分解因式-十字相乘法》課件
- 京津冀地區(qū)農(nóng)業(yè)減污降碳增效協(xié)同:時空演變及影響因素研究
評論
0/150
提交評論