创建透明图片(利用API)
2005-12-16 22:25
344 查看
Option Explicit
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function BitBlt Lib "gdi32" _
(ByVal hDCDest As Long, ByVal XDest As Long, _
ByVal YDest As Long, ByVal nWidth As Long, _
ByVal nHeight As Long, ByVal hDCSrc As Long, _
ByVal XSrc As Long, ByVal YSrc As Long, _
ByVal dwRop As Long) As Long
Private Declare Function CreateBitmap Lib "gdi32" _
(ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal nPlanes As Long, _
ByVal nBitCount As Long, _
lpBits As Any) As Long
Private Declare Function SetBkColor Lib "gdi32" _
(ByVal hdc As Long, _
ByVal crColor As Long) As Long
Private Declare Function SelectObject Lib "gdi32" _
(ByVal hdc As Long, _
ByVal hObject As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" _
(ByVal hdc As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" _
(ByVal hdc As Long)As Long
Private Declare Function DeleteDC Lib "gdi32" _
(ByVal hdc As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" _
(ByVal hObject As Long) As Long>
Private Sub Command1_Click()
Dim rc As RECT
With rc
.Left = 0
.Top = 0
.Right = Picture1.ScaleWidth
.Bottom = Picture1.ScaleHeight
End With
TransparentBlt Form1.hdc, Form1.hdc, Picture1.hdc, rc, 20, 20, vbWhite
End Sub
Private Sub TransparentBlt(OutDstDC As Long, _
DstDC As Long, _
SrcDC As Long, _
SrcRect As RECT, _
DstX As Integer, _
DstY As Integer, _
TransColor As Long)
'DstDC- Device context into which image must be
'drawn transparently
'OutDstDC- Device context into image is actually drawn,
'even though it is made transparent in terms of DstDC
'Src- Device context of source to be made transparent
'in color TransColor
'SrcRect- Rectangular region within SrcDC to be made
'transparent in terms of DstDC, and drawn to OutDstDC
'DstX, DstY - Coordinates in OutDstDC (and DstDC)
'where the transparent bitmap must go. In most
'cases, OutDstDC and DstDC will be the same
Dim nRet As Long, W As Integer, H As Integer
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
W = SrcRect.Right - SrcRect.Left + 1
H = SrcRect.Bottom - SrcRect.Top + 1
'create monochrome mask and inverse masks
MonoMaskDC = CreateCompatibleDC(DstDC)
MonoInvDC = CreateCompatibleDC(DstDC)
hMonoMask = CreateBitmap(W, H, 1, 1, ByVal 0&)
hMonoInv = CreateBitmap(W, H, 1, 1, ByVal 0&)
hPrevMask = SelectObject(MonoMaskDC, hMonoMask)
hPrevInv = SelectObject(MonoInvDC, hMonoInv)
'create keeper DCs and bitmaps
ResultDstDC = CreateCompatibleDC(DstDC)
ResultSrcDC = CreateCompatibleDC(DstDC)
hResultDst = CreateCompatibleBitmap(DstDC, W, H)
hResultSrc = CreateCompatibleBitmap(DstDC, W, H)
hPrevDst = SelectObject(ResultDstDC, hResultDst)
hPrevSrc = SelectObject(ResultSrcDC, hResultSrc)
'copy src to monochrome mask
OldBC = SetBkColor(SrcDC, TransColor)
nRet = BitBlt(MonoMaskDC, 0, 0, W, H, SrcDC, _
SrcRect.Left, SrcRect.Top, vbSrcCopy)
TransColor = SetBkColor(SrcDC, OldBC)
'create inverse of mask
nRet = BitBlt(MonoInvDC, 0, 0, W, H, _
MonoMaskDC, 0, 0, vbNotSrcCopy)
'get background
nRet = BitBlt(ResultDstDC, 0, 0, W, H, _
DstDC, DstX, DstY, vbSrcCopy)
'AND with Monochrome mask
nRet = BitBlt(ResultDstDC, 0, 0, W, H, _
MonoMaskDC, 0, 0, vbSrcAnd)
'get overlapper
nRet = BitBlt(ResultSrcDC, 0, 0, W, H, SrcDC, _
SrcRect.Left, SrcRect.Top, vbSrcCopy)
'AND with inverse monochrome mask
nRet = BitBlt(ResultSrcDC, 0, 0, W, H, _
MonoInvDC, 0, 0, vbSrcAnd)
'XOR these two
nRet = BitBlt(ResultDstDC, 0, 0, W, H, _
ResultSrcDC, 0, 0, vbSrcInvert)
'output results
nRet = BitBlt(OutDstDC, DstX, DstY, W, H, _
ResultDstDC, 0, 0, vbSrcCopy)
'clean up
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
相关文章推荐
- 怎么利用C#创建透明的GIF图片
- [johnsuna(阿山NET)的专栏]怎么利用C#创建透明的GIF图片?(可自定义调色板),收藏一下.
- 怎么利用C#创建透明的GIF图片?(可自定义调色板),收藏一下.
- Hbase的Java API的利用(有关图片等数据的put和get)
- java:利用jexcelapi 创建Excel
- 解决水晶报表中动态加载的图片或利用水晶报表创建的图表不显示图片的方法
- 浅谈如何利用PB实现图片透明叠加(改编)
- Flex中如何利用树形控件(Tree Control)和SWFLoader控件创建简单图片相册的例子
- 利用CImage显示透明PNG图片
- 利用API创建独立值集,并插值
- 利用API快速自动创建(删除)虚拟驱动器
- 创建透明画刷 加载BMP图片
- 利用JavaScript创建随机数与随机图片
- 教你如何利用灰度图透明效果制作隐藏图片.Part2
- php imagecreatetruecolor 创建高清和透明图片代码小结
- VC利用GDI+显示透明的PNG图片
- VC利用GDI+显示透明的PNG图片
- 利用Qt的标准文件对话框及OpenCV创建窗口并显示图片
- php 利用远程图片创建新图片(jpg,gif,png)
- 利用PPT制作PNG透明图片