有2个图片  tmp.bmp  和 mask.bmp  用paintpicture等可以将他们装进一个picturebox中,并且呈现出透明效果。见下面的代码。Sub test()
    Dim sPic As StdPicture, sMask As StdPicture
    ''加载2个图片,可以从文件或从ClipBoard获取。这2个图片“互补”组合在一起可以达到“透明”效果
    Set sPic = LoadPicture("c:\tmp.bmp")
    Set sMask = LoadPicture("c:\mask.bmp")
    ''Pic1为一个picturebox控件。用下面的方法可以显示透明效果
    pic1.PaintPicture sMask, 0, 0, pic1.Width, pic1.Height, 0, 0, pic1.Width, pic1.Height, vbSrcAnd  ' &H8800C6
    pic1.PaintPicture sPic, 0, 0, pic1.Width, pic1.Height, 0, 0, pic1.Width, pic1.Height, vbSrcPaint ' &HEE0086
    ''sPic.Render hdc, 0, 0, 0, 0, 0, 0, 0, 0, 0&'''怎么得到StdPicture的hdc?
    Dim oPic As StdPicture
    Set oPic = pic1.Image ''这里得到的oPic是不透明的!!!
End Sub现在要求
1、不用picturebox控件(因为从它哪里再得到图片是不透明的),能不能用stdpicture本身来操作?
2、如果用stdpicture.render,那么怎么得到stdpicture的hdc?
3、是否还有其它非专业的技术方法可以将一个图片和它的mask图片合成一个透明的图片,关键是我要得到这个透明图片。还望各位大侠指点一二,提前谢谢了......

解决方案 »

  1.   

    普通的方法是无法透明化的,可以使用gdi+
      

  2.   

    用AlphaBlend函数吧,不过还是要用图片框的,因为需要两个DC,要是非得不使用图片框,那就用API创建两个内存DC应该也行,但是不如用图片框简单.Private Declare Function AlphaBlend Lib "msimg32.dll" (ByVal hdc As Long, ByVal lInt As Long, ByVal lInt As Long, ByVal lInt As Long, ByVal lInt As Long, ByVal hdc As Long, ByVal lInt As Long, ByVal lInt As Long, ByVal lInt As Long, ByVal lInt As Long, ByVal BLENDFUNCT As Long) As Long
      Private Sub Form_Load()
      Picture1.AutoSize = True
      Picture1.AutoRedraw = True
      Picture2.AutoSize = True
      Picture2.AutoRedraw = True
      End Sub
      Private Sub Command1_Click()
      Picture1.Picture = LoadPicture("C:\1.bmp")
      Picture2.Picture = LoadPicture("C:\2.bmp")
      AlphaBlend Picture1.hdc, 10, 10, 100, 100, Picture2.hdc, 20, 20, 100, 100, &H10000 * 128
      Picture1.Refresh
      End Sub
      

  3.   

    老马,AlphaBlend可以让一副图片在picture中呈现出淡入淡出效果,它是个整体动作,现在我需要的是让图片的背景透明,也就是局部动作,AlphaBlend能做到吗?现在有两个思路:1、继续找去掉背景的代码;2、根据各点像素值(还好图片都不大,也就16*16)写透明的gif文件。先说第一个思路:继续找去掉背景的代码
    找到了一个office的http://support.microsoft.com/kb/288771/zh-tw
    根据微软提供的代码,做了个试验,结果不成功啊!!
    这是我用画图程序画的图:结果吧,那个洋红的背景并没有被去掉。哪位大侠知道是怎么回事??提示一下,不胜感激。测试代码如下:
    1、vb中的---只需要一个commandPrivate Sub Command1_Click()
        Dim oPic As StdPicture
        Set oPic = LoadPicture(App.Path & "\测试.bmp") '''透明区域的颜色为白色
        CopyBitmapAsButtonFace oPic, &HFF00FF''将做好的图片复制到内存中
        ''这个过程执行完成后再转到excel中执行下面的代码
    End Sub
    '''VB模块中的代码,用微软提供的,这里不再粘贴,以免浪费....请见谅2、excel中的代码Sub test()
        Dim btn As CommandBarButton
        '''需要提前在excel里建立一个名称为 mybar 的自定义工具条,并拖入一个按钮
        Set btn = CommandBars("mybar").Controls(1)
        btn.PasteFace''粘贴内存中的图片
    End Sub
      

  4.   

    是啊,大侠,都怪我没说清楚。这么晚还在回帖,非常感谢您的关注。之所以题目是2个图片的合并,是因为别人问我的时候用的是2个图片(互补的),用picturebox控件的paintpicture属性确实可以将那2副图都考到同一个picturebox中并且有透明效果(可以看到图片框的背景色)。但是经过上述复制处理后再从图片框得到的图片是包含背景色的,是不透明的。.......在网上找了一个 bmp转透明gif的例子(具体网址不记得了,就是让指定的背景色变成透明),确实可以。但是有如下问题:
    转换后的图片不能在web中显示(估计是调色板的问题)。这一点代码中也有说明,代码中还给了一个地址(http://vbaccelerator.com/codelib/gfx/octree.htm)现在打不开了。现在正在找能转换成在web上显示的相关说明。不过还没有什么线索,大侠如果有什么建议,我很期待您的建议........
      

  5.   

    这个东西如果只看效果,用Transparnetblt或者多次bitblt 或者纯像素界别的混合都可以实现.但是如果你说要考虑WEB上使用,则存在比较大的问题,VB对透明的支持有限,
      

  6.   

    惨,暂时只能将图片的背景色和web的背景色保持一致来达到“透明”效果。搜索了好几天,很难找到一份完整的 GIF89a 格式中文说明。大都是英文的,英文又不好,又不专业,其结果只能是   悲......悲......
    怎么就没有一个VB大佬写一个 可以生成能在web中使用的GIF89a格式的透明图片呢?
    像我等菜鸟 花点钱买也可以啊?难道是 “版权”在作怪??!!
      

  7.   

    其实很简单啊,有2个stdpicture(互补图片),使用picturebox的paintpicture方法可以在picturebox中展现出透明效果,我现在想要要那个透明的图片(stdpicture),而且能在web中显示。(1)如果 set stdpicture=picturebox.image 得到的stdpicture是不透明的,带有背景,问了2星期也没有一个解决办法。(2)所以就开始找怎么去掉背景,结果呢找到半个,做出的图片倒是透明的,但是不能在web里用。(3)所以我就想能不能根据GIF89a格式,自己"画",反正那几百张图片都不大,也就12*12像素......
    我的问题其实是在逐步升级的,如果第(3)步还不能成功,就放弃不再想这个问题了。目前虽然不能做到背景真正透明,但是任意修改背景色还是很容易做到的。让大家费心了........
      

  8.   

    我知道你为什么坚持用picturebox的paintpicture方法了,因为它的第一个参数就是stdpicture。这个方法一般来说是不行的,跟光栅运算API没什么区别,还得在picturebox上面动脑筋。这里倒是有一个,可以使picturebox透明,但速度有点慢,用数组也许要快一点:http://bbs.csdn.net/topics/320158998
      

  9.   

    chenjl1031 您说的代码我见过,好像得不到带透明背景的图片。
    我重新说一下问题:
    有一组(2张)图片:home.bmp、homemask.bmp要得到的效果如下(Ulead Gif Animator做的效果不太好):home1.gif(我要stdpicture对象或者是复制到剪贴板中)
    补充说明:以前在word里做的自定义工具条,想用一些自定义按钮图片,现在想将那些图片用在web显示出来。所以便有此要求。(在5楼提到微软的一个例子,但我做实验的时候没成功,笨死了。)
    Sub test()
        Dim btn As CommandBarButton
        Set btn = CommandBars("mybar").Controls(1)
        ''得到一组互补的图片
    ''    Dim std As StdPicture
    ''    Set std = btn.Picture
    ''    SavePicture std, "d:\home.bmp"
    ''    Set std = btn.Mask
    ''    SavePicture std, "d:\homemask.bmp"
        ''设置按钮的自定义图片
        btn.Picture = LoadPicture("d:\home.bmp")
        btn.Mask = LoadPicture("d:\homemask.bmp")
    End Sub
    Sub CombinStd()
        ''根据一组图片得到透明stdpicture或者是复制到剪贴板
        Dim Std1 As StdPicture, Std2 As StdPicture
        Set Std1 = LoadPicture("d:\home.bmp")
        Set Std2 = LoadPicture("d:\homemask.bmp")
        Dim Std3 As StdPicture
        ''现在怎么才能由std1和std2“合并”得到一个透明std3(或者复制到剪贴板也可以)
        ''如果借用picturebox,使用panitpicture方法可以在picturebox中展现出透明的效果
        ''现在的目的是要在web中显示那个图片,可不能有背景色。
    End Sub