'以下在.BAS
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
|