在VB中实现位图的透明放置

2016-02-19 18:10 38 1 收藏

今天图老师小编要跟大家分享在VB中实现位图的透明放置,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

【 tulaoshi.com - 编程语言 】

我们在开发一个软件中,通过扫描仪输进了大量实景图片,这些图片是以位图格式存储的,实际需要将这些图片透明放置到多彩色背景上,而在我们所使用的VisualBasicforWindows开发环境中,只能将WMF格式的矢量图(通过Image控件装载)透明放置到多彩色复杂背景图上,对位图只能象照片一样将图片上的每一个点阵信息贴到复杂背景上。本文讨论的问题就是如何将位图透明放置到多色彩背景上,用于实现不规则前景在复杂背景上的动画,并给出了源程序。
  首先将图片通过扫描仪输入到计算机,以*.BMP格式存盘,然后利用图象处理软件对扫进的图片进行加工,加工过程中应注意:将来准备放到复杂背景上的信息不能是黑色,不准备放到复杂背景上的信息要过滤掉,一律置成黑色。只有这样才能实现将位图上所关注的形状不规则信息透明放置到多彩复杂背景上,且不覆盖背景。我们主要使用Windows的API函数BITBLT产生此效果。
  基本步骤如下:
  (1)首先在Forml上创建3个Picture控制,Name属性分别为PicCel(装载前景位图)、Picmatte(存放前景位图的黑白模板)、Bkgrd(存放复杂背景图象),再创建一个命令控制按钮Commondl。在PicCel上装入一幅黑色背景下的彩色位图;
  (2)将PicCel上的图象拷贝到Picmatte上,然后在Picmatte上进行工作,即在Picmatte上逐行逐点扫描位图信息,凡是非黑色象素点将其置成白色,这样在Picmatte上产生了PicCel的一个黑白模板,Picmatte上的彩色图象大小和PicCel一样,只是将PicCel上的非黑色信息转换成白色;
  (3)PicCel和Picmatte作反相invert运算产生PicCel的反相图象存于PicCel中;
  (4)用或运算将Picmatte贴于复杂背景Bkgrd上;
  (5)用异或运算将PicCel贴于复杂背景Bkgrd上。
  程序清单如下:
  1Constsrccopy=&HCC0020
  2Constsrcinvert=&H660046
  3Constsrcpaint=&HEE0086
  4SubCommand1Click()
  5black=RGB(0,0,0)
  6white=RGB(255,255,255)
  7position=0'拷贝piccel到picmatte上
  8r=bitblt(ByValpicmatte.hDC,ByVal0,ByVal0,ByValpiccel.width,ByValpiccel.Height,ByValpiccel.hDC,ByVal0,ByVal0,ByValsrccopy)
  9Forscanline=0To(piccel.Height-1)
  10Do‘取得picmatte上坐标为(position,scanline)点的颜色
  11currentcolor=getpixel(picmatte.hDC,position,scanline)
  12IfcurrentcolorblackThen‘如果该点不为黑色,则置为白色
  13retlong=setpixel(picmatte.hDC,position,scanline,white)
  14EndIf
  15position=position 1
  16LoopWhilepositionpiccel.Width
  17position=0
  18Nextscanline‘创建原位图piccel的反相图象
  19r=bitblt(ByValpiccel.hDC,ByVal0,ByVal0,ByValpiccel.Width,ByValpiccel.Height,ByValpicmatte.hDC,ByVal0,ByVal0,srcinvert)
  20r=bitblt(ByValbkgrd.hDC,ByVal10,ByVal10,ByValpiccel.Width-1,ByValpiccel.Height-1,ByValpicmatte.hDC,ByVal0,ByVal0,srcpaint)
  21r=bitblt(ByValbkgrd.hDC,ByVal10,ByVal10,ByValpiccel.Width-1,ByValpiccel.Height-1,ByValpiccel.hDC,ByVal0,ByVal0,ByValsrcinvert)
  22EndSub
  23SubCommand2-Click()
  24End
  25EndSub
  26SubForm-Load()
  27picmatte.Width=piccel.Width
  28picmatte.Height=piccel.Height
  29EndSub->

来源:http://www.tulaoshi.com/n/20160219/1616951.html

延伸阅读
方法一 这种方法是在窗体的MouseDown、MouseUp和MouseMove等事件的处理过程中添加代码,实现在鼠标左键按下后移动时,改变窗体的Left和Top属性,实现移动无标题栏的窗体。 进入VB,把窗体Form1的BorderStyle属性设置为0-None(无标题栏),再窗体上添加一个ButtonCommand组件,用来关闭程序。代码如下: PrivateT...
标签: CorelDRAW
很早之前的一篇教程。与大家分享。 ① 怎样使位图在CorelDRAW中没有背景色。 我们先来看一下“有背景”和“无背景”之间的区别。如图所示: screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border=0>  在我们排报纸或做彩页画册时,带背景色...
AutoCAD是一个常用工业绘图平台,用户在使用时经常要用Lisp或ADS进行二次开发,但Lisp处理数据库能力差,编制界面困难,而ADS要求较高.相比之下,VisualBasic(以下简称VB)编写独立程序的速度快,编制界面容易,可进行快速计算,可操作数据库。ACADWIN是AUTOCAD的Windows版程序,具有WINDOWS的许多特点。可以利用DDE进行VB与ACADWIN之间的通讯,实现...
标签: word
Word中如何实现不同页面放置不同页码   在此为了讲解的需要,图老师小编特制作如图所示的示例文档,用于说明问题而设。 将光标放置在第一页的末尾,然后切换至页面布局选项卡,点击分隔符-分节符 下一页项。 接着再将光标放置在第三页的末尾,然后切换至页面布局选项卡,点击分隔符-分节符 下一页项。 切换至...
尽管Windows的API函数在当今Visual成风的时代正渐渐被人们忘却,但是正如当年开发高技巧的DOS软件离不开汇编语言和DOS系统功能调用一样,无论开发平台高级到什么地步,只要Windows还在最底层运作,就要用到API函数。无论VB的开发手段多么高明,功能多么强大,但是在现实应用中,总有一些功能的实现是VB无能为力的。微软也早意识到这一点,...

经验教程

256

收藏

48
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部