如果你的程序肯定工作在win2000/xp中,事情会简单的多, 直接使用API就行了: Private Declare Function TransparentBlt Lib "msimg32.dll" (ByVal hdc 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 nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal crTransparent As Long) As Boolean Private Sub Form_Load() Picture1.AutoSize = True Picture1.ScaleMode = vbPixels Picture2.ScaleMode = vbPixels End Sub Private Sub Picture2_Paint() DoEvents ' 修改下面函数的最后一个参数为图片的背景色就行了。 TransparentBlt Picture2.hdc, 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, vbWhite End Sub 如果你的程序可能工作在win98中,就不要这么用了,因为这个API函数在win98中有严重的资源泄漏问题,不过你可以自己来写一个函数来代替它:'******************************************************************* ' 在两个内存句柄间绘制透明图片 ' ' 参数说明: ' ' DstDC 要绘图的目标句柄 ' DstX, DstY 在目标句柄中绘图的起点坐标, 即左上角坐标 ' lWidth, lHeight 要绘图的尺寸 ' SrcDC 源句柄 ' SrcX, SrcY 源句柄的起点坐标 ' TransColor 透明色 '******************************************************************** Public Sub TransparentBlt(DstDC As Long, DstX As Long, DstY As Long, ByVal lWidth As Long, ByVal lHeight As Long, SrcDC As Long, ByVal SrcX As Integer, ByVal SrcY As Long, TransColor As Long) Dim nRet As Long Dim MonoMaskDC As Long, hMonoMask As Long Dim MonoInvDC As Long, hMonoInv As Long Dim ResultDstDC As Long, hResultDst As Long Dim ResultSrcDC As Long, hResultSrc As Long Dim hPrevMask As Long, hPrevInv As Long Dim hPrevSrc As Long, hPrevDst As Long Dim OldBC As Long Dim OldMode As Integer
1、将图片放到一个PictureBox里面,
2、逐点判断颜色如果是前景色,则保存该点坐标。
3、把这些坐标画在新的画布上面
循环处理以上过程
Private Declare Function TransparentBlt Lib "msimg32.dll" (ByVal hdc 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 nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal crTransparent As Long) As Boolean
Private Sub Form_Load()
Picture1.AutoSize = True
Picture1.ScaleMode = vbPixels
Picture2.ScaleMode = vbPixels
End Sub
Private Sub Picture2_Paint()
DoEvents
' 修改下面函数的最后一个参数为图片的背景色就行了。
TransparentBlt Picture2.hdc, 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, vbWhite
End Sub
如果你的程序可能工作在win98中,就不要这么用了,因为这个API函数在win98中有严重的资源泄漏问题,不过你可以自己来写一个函数来代替它:'*******************************************************************
' 在两个内存句柄间绘制透明图片
'
' 参数说明:
'
' DstDC 要绘图的目标句柄
' DstX, DstY 在目标句柄中绘图的起点坐标, 即左上角坐标
' lWidth, lHeight 要绘图的尺寸
' SrcDC 源句柄
' SrcX, SrcY 源句柄的起点坐标
' TransColor 透明色
'********************************************************************
Public Sub TransparentBlt(DstDC As Long, DstX As Long, DstY As Long, ByVal lWidth As Long, ByVal lHeight As Long, SrcDC As Long, ByVal SrcX As Integer, ByVal SrcY As Long, TransColor As Long)
Dim nRet As Long
Dim MonoMaskDC As Long, hMonoMask As Long
Dim MonoInvDC As Long, hMonoInv As Long
Dim ResultDstDC As Long, hResultDst As Long
Dim ResultSrcDC As Long, hResultSrc As Long
Dim hPrevMask As Long, hPrevInv As Long
Dim hPrevSrc As Long, hPrevDst As Long
Dim OldBC As Long
Dim OldMode As Integer
MonoMaskDC = CreateCompatibleDC(DstDC)
MonoInvDC = CreateCompatibleDC(DstDC)
hMonoMask = CreateBitmap(lWidth, lHeight, 1, 1, ByVal 0&)
hMonoInv = CreateBitmap(lWidth, lHeight, 1, 1, ByVal 0&)
hPrevMask = SelectObject(MonoMaskDC, hMonoMask)
hPrevInv = SelectObject(MonoInvDC, hMonoInv) ResultDstDC = CreateCompatibleDC(DstDC)
ResultSrcDC = CreateCompatibleDC(DstDC)
hResultDst = CreateCompatibleBitmap(DstDC, lWidth, lHeight)
hResultSrc = CreateCompatibleBitmap(DstDC, lWidth, lHeight)
hPrevDst = SelectObject(ResultDstDC, hResultDst)
hPrevSrc = SelectObject(ResultSrcDC, hResultSrc)
OldBC = SetBkColor(SrcDC, TransColor)
nRet = BitBlt(MonoMaskDC, 0, 0, lWidth, lHeight, SrcDC, SrcX, SrcY, vbSrcCopy)
TransColor = SetBkColor(SrcDC, OldBC) nRet = BitBlt(MonoInvDC, 0, 0, lWidth, lHeight, MonoMaskDC, 0, 0, vbNotSrcCopy)
nRet = BitBlt(ResultDstDC, 0, 0, lWidth, lHeight, DstDC, DstX, DstY, vbSrcCopy) nRet = BitBlt(ResultDstDC, 0, 0, lWidth, lHeight, MonoMaskDC, 0, 0, vbSrcAnd)
nRet = BitBlt(ResultSrcDC, 0, 0, lWidth, lHeight, SrcDC, SrcX, SrcY, vbSrcCopy) nRet = BitBlt(ResultSrcDC, 0, 0, lWidth, lHeight, MonoInvDC, 0, 0, vbSrcAnd) nRet = BitBlt(ResultDstDC, 0, 0, lWidth, lHeight, ResultSrcDC, 0, 0, vbSrcInvert) nRet = BitBlt(DstDC, DstX, DstY, lWidth, lHeight, ResultDstDC, 0, 0, vbSrcCopy) hMonoMask = SelectObject(MonoMaskDC, hPrevMask)
DeleteObject hMonoMask
hMonoInv = SelectObject(MonoInvDC, hPrevInv)
DeleteObject hMonoInv
hResultDst = SelectObject(ResultDstDC, hPrevDst)
DeleteObject hResultDst
hResultSrc = SelectObject(ResultSrcDC, hPrevSrc)
DeleteObject hResultSrc
DeleteDC MonoMaskDC
DeleteDC MonoInvDC
DeleteDC ResultDstDC
DeleteDC ResultSrcDC
End Sub