在VB中实现位图的透明放置
今天图老师小编要跟大家分享在VB中实现位图的透明放置,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!
首先将图片通过扫描仪输入到计算机,以*.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->