注册 登录
编程论坛 VB6论坛

[求助]如何比较快速地在VB中透明的显示PNG图象

找不到服务器 发布于 2006-09-09 11:33, 4516 次点击
请问如何比较快速地在VB中透明的显示PNG图象

9 回复
#2
找不到服务器2006-09-10 18:10
郁闷,怎么没人回
郁闷啊,难道没人会吗?
#3
liumangtu2006-09-11 10:23

简单,把png用ps直接改成gif就行了,注:gif也是直接支持透明区域的

#4
找不到服务器2006-09-15 21:17
[QUOTE]简单,把png用ps直接改成gif就行了,注:gif也是直接支持透明区域的
[/QUOTE]

但是VB不支持GIF透明呀,用GIF方式透明速度和质量都比PNG慢.
#5
simpson2007-02-06 21:17

VB 使用PNG透明格式的图片其实是非常容易的,那就是使用XP以上操作系统中的GDI+库:

需要生命的GDI+的函数:
Private Declare Function GdiplusStartup Lib "gdiplus.dll" ( _
ByRef token As Long, _
ByRef inputX As GdiplusStartupInput, _
ByVal Output As Long _
) As Status

Private Declare Sub GdiplusShutdown Lib "gdiplus.dll" (ByVal token As Long)


Private Declare Function GdipCreateFromHDC Lib "gdiplus.dll" ( _
ByVal hdc As Long, ByRef graphics As Long _
) As Status


Private Declare Function GdipDrawImage Lib "gdiplus.dll" ( _
ByVal graphics As Long, ByVal Image As Long, _
ByVal X As Single, ByVal Y As Single _
) As Status


Private Declare Function GdipLoadImageFromFile Lib "gdiplus.dll" ( _
ByVal FileName As Long, ByRef Image As Long _
) As Status

Private Declare Function GdipDisposeImage Lib "gdiplus.dll" _
(ByVal Image As Long) As Status

需要声明的结构:

Private Type GdiplusStartupInput
GdiplusVersion As Long
DebugEventCallback As Long
SuppressBackgroundThread As Long
SuppressExternalCodecs As Long
End Type

具体做法如下:

Dim m_lngGraphics as long
Dim m_lngInstance as long
Dim m_lngPic as long

Private Sub Form_Load() 'GDI+初始化
Dim udtData As GdiplusStartupInput

Randomize

udtData.GdiplusVersion = 1

If GdiplusStartup(app.hInstance, udtData, 0) Then
MsgBox "GDI+ could not be initialized", vbCritical
Exit Sub
End If

If GdipCreateFromHDC(Me.hdc, m_lngGraphics) Then
MsgBox "Graphics object could not be created", vbCritical
Exit Sub
End If

GdipLoadimagefromfile "c:\1.png" , m_lngPic
GdipImageDraw m_lngGraphics,m_lngPic
End Sub

#6
清澂居士2007-02-06 21:35
用BITBLT這個強大的API函數和VB中的XOR,即使是JPG,BMP都能設置透明色````
#7
wangyihua8192007-02-07 14:51
厉害
#8
学习VB才2天2007-02-08 10:04
  以前做图形软件时遇到的图片透明问题今天终于找到解决办法了,不敢独想,给大家共享:放置“透明”的图片
在 VB 中,如果你试着把一只有鸟的图片放到背景的一棵树上,你就会发现树会被鸟遮住一个矩形的区域(即鸟的图片矩形)。我们可以通过以下方法使图片上非鸟的其它部分变透明:我们可以利用一个 WinAPI 函数 BitBlt 对图形进行一系列的位操作来达到此目的。
函数声明:
Declare Function BitBlt Lib "gdi32" Alias "BitBlt" (ByVal hDestDC As Long, _
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _
ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, _
ByVal ySrc As Long, ByVal dwRop As Long) As Long
参数解释:
目标环境:hDestDC——目标设备环境;x——左上角;y——顶端;nWidth——宽;nHeight——高
源环境:hSrcDC——源设备环境;xSrc——源左上角;ySrc——源顶端;dwRop——位处理操作,如 vbSrcAnd;vbSrcAnd;vbSrcCopy;vbSrcErase;vbSrcInvert 等
(目标环境或源环境只能是 Picture, Form 或 Printer 对象。各单位为象素。) 进行处理之前,我们需要对鸟的图片进行处理:先复制一份相同的图形,将其应该透明之处(鸟的背景)设置为黑色(设此图为sPic),再将另一图做以下处理:要复制的地方(鸟)设置为黑色,其余地方设置(鸟的背景)为白色(设此图为Mask)。 设树的图形为名dPic。
最后,请加入以下代码:
R=BitBlt(dPic.hdc,0,0,sPic.Width,sPic.Height,Mask.hdc,0,0,vbScrCopy)
R=BitBlt(dPic.hdc,0,0,sPic.Width,sPic.Height,sPic.hdc,0,0,vbScrInvert)
后记:
1、VB 中的 PaintPicture 方法提供类似功能,但速度不及此方法;
2、在此方法上稍微加入一些代码,就不难实现动画的显示。
3、VB 例子中的 CallDlls 就使用此方法。
#9
找不到服务器2007-02-08 14:57

谢谢楼上的帮助,但总体来说透明的效果不是很好。

只有本站会员才能查看附件,请 登录

#10
virgosoy2012-10-28 13:17
回复 5楼 simpson
请问Type Status的格式是啥?
1