首页 基于VB与VC编程技术的位图图像处理系统的开发

基于VB与VC编程技术的位图图像处理系统的开发

举报
开通vip

基于VB与VC编程技术的位图图像处理系统的开发基于VB与VC编程技术的位图图像处理系统的开发 Development Of Bitmap Graphics Processing System Based ON Programming Technology Of VB and VC 摘要 结合VB与VC编程技术的优点,可开发出快速、高效的位图图像处理系统。介绍了 在VB中通过调用API函数快速获取位图图像像素信息和显示位图图像的方法,说明了VC 中编写DLL及在VB中调用的过程。 关键词 VB,VC,DLL, API函数 Abstract IT can...

基于VB与VC编程技术的位图图像处理系统的开发
基于VB与VC编程技术的位图图像处理系统的开发 Development Of Bitmap Graphics Processing System Based ON Programming Technology Of VB and VC 摘要 结合VB与VC编程技术的优点,可开发出快速、高效的位图图像处理系统。介绍了 在VB中通过调用API函数快速获取位图图像像素信息和显示位图图像的方法,说明了VC 中编写DLL及在VB中调用的过程。 关键词 VB,VC,DLL, API函数 Abstract 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 Bitmap’s 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、 引言 位图图像又称点阵图像,是由许多不同颜色的点组成的,这些点被称为像素。在计算机处理位图时,需要进行大量的数值计算,像素越高,分辩率越高,计算量就越大,图像处理的速度就越慢。以在图像处理中常用的 模板 个人简介word模板免费下载关于员工迟到处罚通告模板康奈尔office模板下载康奈尔 笔记本 模板 下载软件方案模板免费下载 处理为例,对于一幅模板为N*N的图像,就要进行9(N-2)2次乘法,8(N-2)2次加法操作,算法复杂度为O(N2),运算量非常之大。鉴于此,笔者认为可利用VB与VC编程技术上各自的优点来开发出一种快速、高效的位图图像处理系统。 VB在界面编程中具有所见即所得的优势,且编程快速、简单,但代码运行较慢。VC编写的程序,编译后代码的执行速度比VB快,但编程较为复杂。因此,位图图像处理系统的开发,对于系统界面等不涉及大量数值计算的程序可利用VB的优势来编程,对于位图图像处理等涉及大量数值计算的程序可利用VC的优势来编程。可采用在VB中调用VC编写的DLL(动态链接库)的方法,就能实现VB与VC的优化组合,这样开发出的位图图像处理系统不仅能提高编程的效率,同时也能保证处理位图图像速度。以下介绍开发过程: 2、 VB中调用DLL的实现 DLL(Windows API是一种典型的DLL库)是一种包含了一些函数和例程的可执行文件,其本身并不能单独运行,但可为其它应用程序提供服务。在VB中调用DLL时,必须首先告诉VB如何正确地向DLL例程传递函数,可使用Declare语句对DLL中的例程进行声明,Declare语句的语结构有如下两种: [Public/Private] Declare Sub name Lib ―libname‖ [Alias ―aliasname‖] [([arghlist])] [Public/Private] Declare Function name Lib ―libname‖ [Alias ―aliasname‖] [([arghlist])] [as type] 如果一个DLL过程没有返回值,就应该被声明为子过程的形式,即采用前一种语法结构;如果一个DLL过程返回了一个可用于表达式的值,则应被声明为函数的形式,即采用后一种语法结构。 在类模块或窗体模块中的DLL过程只能被声明为Private,并只能在模块中使用。在 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 模块中,只能声明为Public,且这个DLL过程能为 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 中所有的模块访问。其中name指明了过程名,其命名需遵循VB命名规则。Lib子句指明了包含所声明过程的动态链接库或代码资源,该动态链接库或代码资源由libname指定,如果后缀名为“.dll”,则可以省略。如果libname没有指定路径名,VB会按如下规则进行搜索:?.exe文件所在目录。?当前目录。?Windows系统目录。?Windows目录。?Path环境变量中的目录。 VB在传递参数时有两种方式,按值的方式(Byval)和按引用的方式(ByRef)传递。按值的方式传递时,传递的实际上是变量的一个副本,接受该参数的过程所作的改变只针对该副本,不会影响变量本身。按引用的方式传递是VB6的默认方式。在这种方式中,实际上传递的并不是变量的值,而是指向这个变量的32位地址。所调用的过程根据这个地址来获取变量的实际值。这样过程可以通过对地址中的值的修改来达到永久修改参数原有值的目的。 C/C++的数据类型与VB的数据类型并不相同。在VB中调用C 或C++编写的DLL,需要知道两者数据类型之间的对应关系,如表1所示。当然,并不是两者之间所有的数据类型都能找到对应关系。声明了过程后,就可以使用该过程名name访问该过程。 表1 C中数据类型与声明DLL过程所用参数格式的对应关系 C中的数据类型 VB里Declare中使用C中的数据类型 VB里Declare中使用 的参数声明格式 的参数声明格式 BOOL ByVal variable as long BYTE ByVal variable as byte CHAR ByVal variable as byte DWORD ByVal variable as long HWND,HDC等ByVal variable as long INT,UNIT ByVal variable as long Windows句柄 LONG ByVal variable as long LPDWORD ByVal variable as long LPINT,LPUNIT ByVal variable as long LPVOID ByVal variable as any NULL As any 或 SHORT ByVal variable as ByVal variable as long Integer WORD ByVal variable as LPWORD ByVal variable as Integer Integer 3、 VB中获取位图的像素信息和显示位图的实现 为了在VB中快速地获取像素信息和显示位图,需要使用三个API函数。可以利用API函数GetObject获取位图格式信息;用GetBitmapBits获取位图的像素信息;用SetBitmapBits将像素信息返回给位图并显示出来。 3(1 GetObject函数在VB中的声明如下: [Public/Private] Declare Function GetObject Lib ―gdi32‖ Alias ―GetObjectA‖ (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long hObject是图像对象(位图、画笔、刷子、字体、调色板等)的句柄,nCount是接受对应图像对象信息的结构的字节数,lpObject是指向接受对应图像信息的结构的指针。如果是位图,hObject是位图的句柄,而接受图像信息的结构为BITMAP,其定义如下: [Public/Private] Type BITMAP ’14 bytes bmType As Long bmWidth As Long bmHeight As Long bmWidthBytes As Long bmPlanes As Integer bmBitsPixel As Integer bmBits As Long End Type 其中BmType指明了位图的类型,这个值必须是0;bmWidth代表位图以像素为单位的图像宽度;bmHeight代表位图以像素为单位的图像高度;bmWidthBytes指明了每个扫描行的字节数(即以字节为单位的图像宽度),这个值必须可被2整除;bmPlanes代表图像的颜色面数;bmBitsPixel指明每个像素用几位数据来表示(8,16,24,32);bmBits是指向图像数据的指针。 3(2 GetBitmapBits和SetBitmpBits分别用于从位图中获取图像中的像素信息和把像素信息返回给位图。两者在VB中的声明如下: [Public/Private] Declare Function GetBitmapBits Lib ―gdi32‖Alias ―GetBitmapBits‖ (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long [Public/Private] Declare Function SetBitmapBits Lib ―gdi32‖Alias ―SetBitmapBits‖ (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long 其中hbitmap是位图的句柄,dwCount是图像信息的大小,lpBits是保存图像信息的地址。 3(3 三个API函数的用法。 首先新建一个VB工程,在其中添加一个Picture Box控件Picture1,在其中加载一幅图 片。然后分别声明以上三个API函数和BITMAP类型。最后添加下面的代码。 Dim Besult As Long, totbytes As Long Dim bmp As BITMAP Dim lmgArray() As Byte Result=GetObject(Picture1.Picture.handle, Len(bmp), bmp) ’获取位图图像格式信息 totbytes=bmp.bmWidthBytes*bmp.bmHeight ’总共要多多少个Byte来存图 ReDim lmgArray(totbytes) Result=GetBitmapBits(Picture1.Picture.handle, totbytes,lmgArray(0)) ’获得图片像素信息 ’在这里加入对图像像素数据进行处理的程序 Call SetBitmapBits(Picture1.Picture.handle, totbytes,lmgArray(0)) ’ 显示处理结果 Picture1.Refresh 4、 VC中编写DLL,供VB中调用 为了在VC编写的动态链接库中处理图像像素,需要VB把获取的位图图像像素信息传送给DLL。上文,已经介绍了获取像素信息的方法,这里说明的是把存有像素信息的数组传送给DLL。由于数值型的数组在VB中其数据是连续存放的,而在C/C++中数组可以等价于指向数组第1个元素的指针。那么可以用引用的方式把VB中数组的第1个元素的地址传给VC编写的DLL,在DLL中用一个指针来接收,这样就达到了传递数组的目的。至于从DLL传递数组给VB,方法相同,只不过过程相反而已。注意在这个过程中VB和VC中的数据类型一定要对应的。同时,因为在C/C++中并不检查数组的界限,需要告诉DLL数组的大小。下面以对灰度图像进行锐化为例说明编写和调用DLL的一般方法。 先在VC中选择新建一个MFC AppWizard(dll)项目,取名为Mydll,并接受下面的选项的默认设置。接着在Globals项下添加一个新过程Myfunc,其定义如下: void_stdcall Myfunc(LPVOID PicArray, long PicHeight, long PicWidth) //PicArray是接受数组的指针,PicHeight和PicWidth分别是图像以字节为单位的高度和宽度。 { long Presult; int temple[3][3]; //定义模板数组 for (int i=0;i<3;i++) //模板数组赋值 { for (int j =0;j<3;j++) { temple[i][j] =-1; } } temple[1][1]=9; for (i=1;i255) PResult=255; if (PResult<0) PResult=0; *(picArray +(i –1)*picWidth +j) = (byte) PResult; } } } 在建立项目之前,需要在Mydll.def文件的EXPORTS项下加一行Myfunc。因为在VB的命名规则中第1个字符不允许为“-”,而VC编写的过程,其默认的导出函数,会在函数名前加“-”。所以只有强制VC按要求命名导出函数。生成Mydll.dll后,将Mydll.dll复制到VB编写的执行文件所在的目录。在VB中对应声明Myfunc过程。 Private Declare Sub Myfunc Lib ―mydll‖ (PicArray as Byte, PicHeight as Long, PicWidth as Long) 最后就可以直接在模块中调用Myfunc,处理位图图像像素数据了。 5、 结束语 将VB与VC相结合,利用VB界面设计简单并可调用DLL和VC能处理大量复杂运算的优点,不但能缩短编程时间,提高工作效率,而且还能开发出快速、高效的位图图像处理系统,对编写图像处理程序而言,能起到事半功倍的效果,确实是一种可行的好方法。 参考文献 1、 谭浩强. Visual Basic 程序设计. 北京:高等教育出版社,1999.11. P221—P250. 2、 郑阿奇. Visual C++ 6.0 教程 人力资源管理pdf成真迷上我教程下载西门子数控教程protel99se入门教程fi6130z安装使用教程 . 北京:机械工业出版社,2004.9. P255—P281
本文档为【基于VB与VC编程技术的位图图像处理系统的开发】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_196623
暂无简介~
格式:doc
大小:24KB
软件:Word
页数:0
分类:生活休闲
上传时间:2018-01-06
浏览量:8