透明位图

原创 2004年06月11日 10:26:00

 

'以下在form 需二个PictureBox,一个Image Control, 一个Command Box

vate Sub Command1_Click()
Dim dx As Long, dy As Long

Call GetInvertMaskPic(Picture1, Image1, RGB(255, 255, 255))
'注释:请确认相对pen.bmp图的背景颜色是什麽,本例中是白色,故使用RGB(255,255,255)
Call GetMaskPic(Picture1, Image1, RGB(255, 255, 255))

dx = Me.ScaleX(Image1.Picture.Width, vbHimetric, vbPixels)
dy = Me.ScaleY(Image1.Picture.Height, vbHimetric, vbPixels)

'注释: 以下将image1的图去除背景画在Picture2之上
Set Picture1.Picture = Image1.Picture
BitBlt Picture2.hDc, 0, 0, dx, dy, hMaskDC, 0, 0, vbSrcAnd
BitBlt Picture1.hDc, 0, 0, dx, dy, hInvertMaskDC, 0, 0, vbSrcAnd
BitBlt Picture2.hDc, 0, 0, dx, dy, Picture1.hDc, 0, 0, vbSrcPaint

End Sub

Private Sub Form_Load()
Picture1.Visible = False
Picture1.AutoRedraw = True
'注释:Picture1.Appearance = 0 注释:要事先设定
Picture1.BorderStyle = 0
Set Image1.Picture = LoadPicture("c:/1.wmf") '注释:请自行设定您的图
'Set Picture2.Picture = LoadPicture("c:/2.bmp")   '注释:请设定成自己的背景图
Picture2.Height = Image1.Height
Picture2.Width = Image1.Width
Picture2.Picture = Image1.Picture
End Sub

''module1---------------------------

Declare Function CreateCompatibleBitmap Lib "GDI32" _
   (ByVal hDc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Declare Function CreateCompatibleDC Lib "GDI32" _
   (ByVal hDc As Long) As Long
Declare Function DeleteObject Lib "GDI32" _
   (ByVal hObject As Long) As Long
Declare Function SelectObject Lib "GDI32" _
   (ByVal hDc As Long, ByVal hObject As Long) As Long
Declare Function DeleteDC Lib "GDI32" _
   (ByVal hDc As Long) As Long
Declare Function BitBlt Lib "GDI32" _
   (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
Declare Function SetBkColor Lib "GDI32" _
   (ByVal hDc As Long, ByVal crColor As Long) As Long

Public hMaskDC As Long, hBmpMask As Long
Public hInvertMaskDC As Long, hBmpInvertMask As Long

'注释:取得 hMaskDC 的自订函数,该hMaskDC内的图像是souImg图之背景为白色
'注释:              而souImg的前景图是黑色
'注释:PicBack 叁数: 用来制作 Mask 图的图片盒
'注释:souImg 叁数: 摆放原图的影像之物件,可以是 image/picturebox
'注释:TColor 叁数: 欲去除的颜色,即souImg的背景色
Public Sub GetMaskPic(picBack As PictureBox, _
    souImg As Control, ByVal TColor As Long)
Dim hdcMono, hbmpMono, hbmpOld
Dim ColorBack As Long
Dim dx As Long, dy As Long

    With picBack
    '注释:取得该图的大小, by Pixels
    dx = .ScaleX(souImg.Picture.Width, vbHimetric, vbPixels)
    dy = .ScaleY(souImg.Picture.Height, vbHimetric, vbPixels)
'注释:     设定pictureBox的大小与Source Image的大小相同
    .Width = souImg.Width
    .Height = souImg.Height
    Set .Picture = souImg.Picture
    End With
  
    hdcMono = CreateCompatibleDC(0)
    hbmpMono = CreateCompatibleBitmap(hdcMono, dx, dy)
    hbmpOld = SelectObject(hdcMono, hbmpMono)
  
    picBack.AutoRedraw = True
    picBack.BackColor = RGB(255, 255, 255)
  
    ColorBack = SetBkColor(picBack.hDc, TColor)
    BitBlt hdcMono, 0, 0, dx, dy, picBack.hDc, 0, 0, vbSrcCopy
    Call SetBkColor(picBack.hDc, ColorBack)
    BitBlt picBack.hDc, 0, 0, dx, dy, hdcMono, 0, 0, vbSrcCopy
  
    hMaskDC = CreateCompatibleDC(0)
    hBmpMask = CreateCompatibleBitmap(picBack.hDc, dx, dy)
    Call SelectObject(hMaskDC, hBmpMask)
    BitBlt hMaskDC, 0, 0, dx, dy, picBack.hDc, 0, 0, vbSrcCopy
 
    Call SelectObject(hdcMono, hbmpOld)
    Call DeleteDC(hdcMono)
    Call DeleteObject(hbmpMono)
  
End Sub

'注释:取得 hInvertMaskDC 的自订函数,该hMaskDC内的图像是souImg图之背景为白色
'注释:              而souImg的前景图是黑色
'注释:PicBack 叁数: 用来制作 Mask 图的图片盒
'注释:souImg 叁数: 摆放原图的影像之物件,可以是 image/picturebox
'注释:TColor 叁数: 欲去除的颜色,即souImg的背景色
Public Sub GetInvertMaskPic(picBack As PictureBox, _
    souImg As Control, ByVal TColor As Long)
Dim hdcMono, hbmpMono, hbmpOld
Dim ColorBack As Long
Dim dx As Single, dy As Single

    With picBack
    dx = .ScaleX(souImg.Picture.Width, vbHimetric, vbPixels)
    dy = .ScaleY(souImg.Picture.Height, vbHimetric, vbPixels)
'注释:     设定pictureBox的大小与Source Image的大小相同
    .Width = souImg.Width
    .Height = souImg.Height
    Set .Picture = souImg.Picture
    End With
  
    hdcMono = CreateCompatibleDC(0)
    hbmpMono = CreateCompatibleBitmap(hdcMono, dx, dy)
    hbmpOld = SelectObject(hdcMono, hbmpMono)
  
    picBack.AutoRedraw = True
    picBack.BackColor = RGB(255, 255, 255)
  
    ColorBack = SetBkColor(picBack.hDc, TColor)
    BitBlt hdcMono, 0, 0, dx, dy, picBack.hDc, 0, 0, vbSrcCopy
    Call SetBkColor(picBack.hDc, ColorBack)
    BitBlt picBack.hDc, 0, 0, dx, dy, hdcMono, 0, 0, vbNotSrcCopy
    
    hInvertMaskDC = CreateCompatibleDC(0)
    hBmpInvertMask = CreateCompatibleBitmap(picBack.hDc, dx, dy)
    Call SelectObject(hInvertMaskDC, hBmpInvertMask)
    BitBlt hInvertMaskDC, 0, 0, dx, dy, picBack.hDc, 0, 0, vbSrcCopy

    Call SelectObject(hdcMono, hbmpOld)
    Call DeleteDC(hdcMono)
    Call DeleteObject(hbmpMono)
  
End Sub

 

透明位图--SRCINVERT用法讲解

实现透明位图,有一个知识点必须要提前知道,那就是: 注意对于图片来说,只有纯黑RGB(0,0,0)为0,其余即使是RGB(0,0,1)也是1 如果一个单色位图向彩色位图转换,那么单色位...
  • u012513234
  • u012513234
  • 2015年04月23日 22:24
  • 859

MFC中透明位图原理

总之,就是不断反复遮罩“过滤掉”透明色就行,先来整段代码,后面再详细介绍。 void CTransDlg::OnPaint() { CPaintDC dc(this); CMemDC m_...
  • xiangsimoyinjiu
  • xiangsimoyinjiu
  • 2016年03月28日 23:04
  • 1672

MFC 绘制透明位图的方法

1、GDI     步骤1)创建内存兼容DC         HDC hBitmapDC = CreateCompatibleDC(hDC);         HBITMAP hBitmap =...
  • xuheazx
  • xuheazx
  • 2014年09月24日 15:27
  • 1173

GDI绘制透明位图

/* 下面的DrawTransparentBmp函数是一个完整的正确显示透明位图的函数,其各参数说明如下: HDC   hdc:目标HDC,即将要绘制位图的HDC HBITMAP   hbm...
  • chinabinlang
  • chinabinlang
  • 2011年10月20日 11:12
  • 3435

绘制半透明位图以及如何画透明位图

绘制半透明位图有的时侯,我们希望显示一幅半透明的位图。也就是说我们将一幅位图B显示到A位图上,又希望透过B位图看到A位图的一部分图像但不是全部。比如A位图是一幅曲线图,B是一幅提示位图,我们想在显示提...
  • mynote
  • mynote
  • 2005年03月09日 08:57
  • 1563

MFC中实现位图的透明显示

好久没写博客了,尝试着重新开张~   最近在协助同事修改原有的一个程序,因为要申请个什么东西,界面上也一直在下功夫。 原来的程序界面是用MFC做的,想添加一些图片,不过图片都不是矩形,周围有白边...
  • crazyingBird
  • crazyingBird
  • 2014年04月02日 19:36
  • 6088

BitBlt 画透明位图

CDC::BitBlt函数,应用在GDI的绘图中,有时候我们需要显示的位图有一部分是透明的,例如在棋类游戏中,棋盘图片和棋子图片融合的时候,棋子边缘应该是透明。        在图1中,棋盘和棋子图片...
  • u012513234
  • u012513234
  • 2015年04月24日 20:24
  • 2134

MFC透明位图显示函数

研究好久才弄好,注释的比较详细,不明白的函数可以参考MSDN  bool TransparentDIB(CBitmap * dib, /*要绘制的位图*/ CDC * pDC, /*目标DC*...
  • shwneo
  • shwneo
  • 2010年02月25日 17:21
  • 3568

VB用Bitblt实现透明位图显示

Visual Basic CodeAPI声明Private Declare Function BitBlt Lib "gdi32"   ( ByVal hDestDC As Long, ByVal x...
  • SupermanKing
  • SupermanKing
  • 2008年12月16日 00:19
  • 7030

MCGS导入位图后如何设置透明

在导入位图前,先将图片保存成bmp格式,用windows自带的画图工具,将图片保存成256色,这样在mcgs中设置透明处理时可以将背景全透明,之前没有这样保存,在设置背景时还有些白色的区域没有透明。改...
  • zhang337337
  • zhang337337
  • 2013年01月04日 16:43
  • 2741
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:透明位图
举报原因:
原因补充:

(最多只允许输入30个字)