用API绘图会比VB自己的函数快吗

用API绘图会比VB自己的函数快吗,第1张

 API函数是指, *** 作系统除了协调应用程序的执行、内存分配、系统资源管理外,同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务是一个函数),可以帮助应用程序达到开启视窗、描绘图形、使用周边设备的函数服务的对象的应用程序。

  利用VBa使用API函数的方法:

  (1)用Declare语句声明所要调用的API函数,若该函数无返回值,可声明为Sub过程;若有返回值,则可声明为Function函数。

  (2)一旦声明了某一个API函数后,就可以象调用VisualBasic的函数一样。但如果参数传递不对,可能会导致死机。

在VB中提供了完善的做图方法, 可以在窗体或图形框中绘制各种图形, 其中提供了一个方便的图像处理命令即:PaintPicture, 此命令的功能与WINDOWS API 函数BitBlt类似,但由于不用做API函数说明,并且有它独特的功能,所以更有它的方便之处, 使用它可以完成很多图像的特殊处理工作。

 一、语法格式:

 PaintPicture Pic,destX,destY,destWidth,destHeight,scrX,scrY,scrWidth,scrHeight

 其中Pic:为对象, 如图形框Picture等;

 destX,destY:目标图像位置;

 destWidth,destHeight:目标图像尺寸;

 scrX,scrY:原图像的裁剪坐标;

 scrWidth,scrHeight:原图像的裁剪尺寸;

 从以上格式可以看出,此命令的功能就是把一个源图像资源任意复制到指定的区域,并且通过改变参数destWidth与destHeight值,还可以改变复制后的图像的尺寸,实现放大或缩小图像显示, 甚至可以置这两个属性为负值, 这样可使目标图像在水平方向翻转,实现特殊效果的图像显示。

 二、应用举例

 1墙纸的制作

 所谓的墙纸, 就是用一个小尺寸的图像连续在一个区域显示, 形成规则的重复图像, 也称为图像的平铺显示,利用“PaintPicture"命令可以方便的完成此工作, 即用一个固定的图像资源多次连续复制到窗口中; 复制过程中必须准确计算下一图像的起始位置; 显示过程中可采取两种方法, 第一种方法可置源图像资源即图形框的AutoSize属性为真, 并且显示过程中按源图像的实际尺寸复制, 这是正常的图像平铺显示; 还有一种方法就是通过置AutoSize属性为假, 然后改变图形框的尺寸, 或者直接修改目标图像的尺寸, 这样可实现放大或缩小图像的平铺显示。具体作方法请见Command1_Click()事件中的代码。

 2随机图像显示

 随机图像在一定场合具有特殊的魅力,比如把一个固定的图像连续的在某一区域中的随机位置显示,这样即可得到一种特殊的屏幕效果,具体 *** 作时需要使用VB的内部函数RND, 此函数可产生0-1之间的随机数, 通过此随机数确定显示的图像的位置即destX与destY参数, 这样即可使图像在随机位置显示, 通过此原理也可以使图像的尺寸等其它参数随机产生, 以产生其它效果的随机图像效果。具体 *** 作方法请见Command2_Click()事件中的代码。

 3镜头推出效果

 镜头推出效果实际上就是图像的放大或缩小显示, 利用“PaintPicture"命令实现此功能,只需要改变destWidth及destHeight参数即可, 具体 *** 作时需要注意保持图像的中心点不变, 在图像的放大或缩小过程中同时改变图像的起始坐标。此命令的图像显示速度不低于API函数的BitBlt命令, 图像放大或缩小过程中基本没有抖动的感觉。具体 *** 作方法请见Command3_Click()事件中的代码。

 4拖尾效果的形成

 此效果的形成与图像的放大过程基本相似,区别在于无需保持中心点不变,而在图像的放大过程中,向一个方向逐渐改变图像的起始位置,并且起始的图像尺寸置为0,这样当图像放大显示到一定位置时,其后面就留下了多彩的拖尾效果。具体 *** 作方法请见Command4_Click()事件中的代码。

 三、演示程序

 文后的程序完整的演示了上述各种图像的特殊处理效果,编程需要在From1窗体中安放两个图形框Picture1 及Picture2, 还有五个命令按钮Command1-Command5,之后把下述代码填入相应的事件中, 运行程序后通过按钮1-4即可演示上述的四种图像处理效果, 按"退出"按钮则结束程序。以上方法及程序在WINDOWS95系统、VB40环境下调试通过。

 图像平铺显示

 Private Sub Command1_Click()

 Dim numm As Integer

 Picture1AutoSize = True

 roww = Int(Form1Width / Picture1Width) + 1

 coll = Int(Form1Height / Picture1Height) + 1

 For i = 0 To roww

 For j = 0 To coll

 Form1PaintPicture Picture1Picture,jPicture1Width,iPicture1Height,Picture1Width,Picture1Height

 numm = numm + 1

 Form1Caption = "使用图像个数:" + Str$(numm)

 Next j

 Next i

 Picture1Visible = 0

 End Sub

建议先将灰度黑白翻转(src = 255 - src;)

对进行竖直方向的投影,设置一个阈值,用于把做列分割例如由 投影位置i为0(或者小于某个值的时候),而i+1有较大值,则可知道这是一个字符的起始位置,同理可以得到结束位置。根据起始和结束位置就能够把每个字单独分开了。再根据 结束 - 起始 判断自宽,字符宽的地方 涂白就好

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12178774.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存