《基于VB与VC编程技术的位图图像处理系统的开发样本.doc》由会员分享,可在线阅读,更多相关《基于VB与VC编程技术的位图图像处理系统的开发样本.doc(8页珍藏版)》请在金锄头文库上搜索。
1、资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。基于VB与VC编程技术的位图图像处理系统的开发 黄立靖 ( 福建林业职业技术学院 福建南平 353000) 摘要 结合VB与VC编程技术的优点, 可开发出快速、 高效的位图图像处理系统。介绍了在VB中经过调用API函数快速获取位图图像像素信息和显示位图图像的方法, 说明了VC中编写DLL及在VB中调用的过程。关键词 VB, VC, DLL, API函数Development Of Bitmap Graphics Processing System Based ON Programming Technology Of VB and V
2、CHUANG Li-jing(Fu Jian Forestry Vocational & Technical College FuJian NanPing 353000)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 Bit
3、maps 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、 引言位图图像又称点阵图像, 是由许多不同颜色的点组成的, 这些点被称为像素。在计算机处理位图时, 需要进行大量的数值计算, 像素越高, 分辩率越高, 计算量就越大, 图像处理的速度就越慢。以在图像处理中常见的模板
4、处理为例, 对于一幅模板为N*N的图像, 就要进行9( N-2) 2次乘法, 8( N-2) 2次加法操作, 算法复杂度为O( N2) , 运算量非常之大。鉴于此, 笔者认为可利用VB与VC编程技术上各自的优点来开发出一种快速、 高效的位图图像处理系统。VB在界面编程中具有所见即所得的优势, 且编程快速、 简单, 但代码运行较慢。VC编写的程序, 编译后代码的执行速度比VB快, 但编程较为复杂。因此, 位图图像处理系统的开发, 对于系统界面等不涉及大量数值计算的程序可利用VB的优势来编程, 对于位图图像处理等涉及大量数值计算的程序可利用VC的优势来编程。可采用在VB中调用VC编写的DLL( 动
5、态链接库) 的方法, 就能实现VB与VC的优化组合, 这样开发出的位图图像处理系统不但能提高编程的效率, 同时也能保证处理位图图像速度。以下介绍开发过程: 2、 VB中调用DLL的实现DLL( Windows API是一种典型的DLL库) 是一种包含了一些函数和例程的可执行文件, 其本身并不能单独运行, 但可为其它应用程序提供服务。在VB中调用DLL时, 必须首先告诉VB如何正确地向DLL例程传递函数, 可使用Declare语句对DLL中的例程进行声明, Declare语句的语结构有如下两种: Public/Private Declare Sub name Lib ”libname” Alia
6、s ”aliasname” (arghlist)Public/Private Declare Function name Lib ”libname” Alias ”aliasname” (arghlist) as type如果一个DLL过程没有返回值, 就应该被声明为子过程的形式, 即采用前一种语法结构; 如果一个DLL过程返回了一个可用于表示式的值, 则应被声明为函数的形式, 即采用后一种语法结构。在类模块或窗体模块中的DLL过程只能被声明为Private, 并只能在模块中使用。在标准模块中, 只能声明为Public, 且这个DLL过程能为工程中所有的模块访问。其中name指明了过程名, 其
7、命名需遵循VB命名规则。Lib子句指明了包含所声明过程的动态链接库或代码资源, 该动态链接库或代码资源由libname指定, 如果后缀名为”.dll”, 则能够省略。如果libname没有指定路径名, VB会按如下规则进行搜索: .exe文件所在目录。当前目录。Windows系统目录。Windows目录。Path环境变量中的目录。VB在传递参数时有两种方式, 按值的方式( Byval) 和按引用的方式( ByRef) 传递。按值的方式传递时, 传递的实际上是变量的一个副本, 接受该参数的过程所作的改变只针对该副本, 不会影响变量本身。按引用的方式传递是VB6的默认方式。在这种方式中, 实际上传
8、递的并不是变量的值, 而是指向这个变量的32位地址。所调用的过程根据这个地址来获取变量的实际值。这样过程能够经过对地址中的值的修改来达到永久修改参数原有值的目的。C/C+的数据类型与VB的数据类型并不相同。在VB中调用C 或C+编写的DLL, 需要知道两者数据类型之间的对应关系, 如表1所示。当然, 并不是两者之间所有的数据类型都能找到对应关系。声明了过程后, 就能够使用该过程名name访问该过程。表1 C中数据类型与声明DLL过程所用参数格式的对应关系C中的数据类型VB里Declare中使用的参数声明格式C中的数据类型VB里Declare中使用的参数声明格式BOOLByVal variabl
9、e 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 varia
10、ble as longSHORTByVal variable as IntegerWORDByVal variable as IntegerLPWORDByVal variable as Integer3、 VB中获取位图的像素信息和显示位图的实现为了在VB中快速地获取像素信息和显示位图, 需要使用三个API函数。能够利用API函数GetObject获取位图格式信息; 用GetBitmapBits获取位图的像素信息; 用SetBitmapBits将像素信息返回给位图并显示出来。31 GetObject函数在VB中的声明如下: Public/Private Declare Function Ge
11、tObject Lib ”gdi32” Alias ”GetObjectA” (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As LonghObject是图像对象( 位图、 画笔、 刷子、 字体、 调色板等) 的句柄, nCount是接受对应图像对象信息的结构的字节数, lpObject是指向接受对应图像信息的结构的指针。如果是位图, hObject是位图的句柄, 而接受图像信息的结构为BITMAP, 其定义如下: Public/Private Type BITMAP 14 bytesbmType As Longb
12、mWidth As LongbmHeight As LongbmWidthBytes As LongbmPlanes As IntegerbmBitsPixel As IntegerbmBits As LongEnd Type其中BmType指明了位图的类型, 这个值必须是0; bmWidth代表位图以像素为单位的图像宽度; bmHeight代表位图以像素为单位的图像高度; bmWidthBytes指明了每个扫描行的字节数( 即以字节为单位的图像宽度) , 这个值必须可被2整除; bmPlanes代表图像的颜色面数; bmBitsPixel指明每个像素用几位数据来表示( 8, 16, 24,
13、32) ; bmBits是指向图像数据的指针。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”
14、Alias ”SetBitmapBits” (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long其中hbitmap是位图的句柄, dwCount是图像信息的大小, lpBits是保存图像信息的地址。33 三个API函数的用法。首先新建一个VB工程, 在其中添加一个Picture Box控件Picture1, 在其中加载一幅图片。然后分别声明以上三个API函数和BITMAP类型。最后添加下面的代码。Dim Besult As Long, totbytes As LongDim bmp As BITMAPDim
15、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) 获得图片像素信息在这里加入对图像像素数据进行处理的程序Call SetBitmapBits(Picture1.Picture.handle, totbytes,lmgArray(0) 显示处理结果Picture1.Refresh4、 VC中编写DLL, 供VB中调用为了在VC编写的动态链接库中处理图像像素, 需要VB把获取的位图图像像素信息传送给DLL。上文, 已经介绍了获取像素信息的方法, 这里说明的是把存有像素信息的数组传送给DLL。由于数值型的数组在VB中其数据是连续存放的, 而在C/C+中数组能够等价于指向数组第1个元素的指针。那么能够用引用的方式把VB中数组的第1个元素的地址传给VC编写的DLL, 在DLL中用一个指针来接收, 这样