在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

制作圖像的Mask圖

制作圖像的Mask圖

更新時間:2019-07-04 文章作者:未知 信息來源:網絡 閱讀次數:

制作Mask圖形的目的是為了把某一個圖,去除其背景顏色,而將之畫在另一個圖上面,比如說有一張方形的BitMap圖,上有一枝筆,而其背景是藍色,如何將這筆畫在另一張圖上,而且筆原先的藍背景不會畫上去。
  這個問題便得制造出筆的Mask圖,與Invert的Mask圖,該Mask圖長像是:背景顏色(本例是藍色)變成白色,其他顏色變成黑色,而Inver的Mask圖則反之。

  本范例使用GetMaskPic()來取得Mask圖的Handle of Memory DC (hMaskDC),用GetInvertMaskPic()來取得Invert Mask圖的Handle of Memory DC (hInvertMaskDC),事實上,如果想要二者同時取得實在沒有必要分成兩個函式來做,只要一個就好了,這里只是一個范例,告訴大家如果想要個別取得時該如何做啦。

我將這原理簡單的說明一下:

1.hdcMono = CreateCompatibleDC(0)
  產生一個Memory DC(與目前螢幕hDC相容),此時該MemoryDC繪的大小只有一個單色pixel

2.hbmpMono = CreateCompatibleBitmap(hdcMono, dx, dy)
  產生一個大小是dx*dy 的Bitmap,而它的第一個叁數是Memory DC所以是單色的BitMap

3.hbmpOld = SelectObject(hdcMono, hbmpMono)
  這個動作一做,該hdcMono的繪圖區就變成hbmpMono了,也就是說可以想像hdcMono有一個大小是dx*dy(by pixels)的繪圖區,在其上的畫圖會反映到hBmpMono之上

4.picBack.AutoRedraw = True
  設定picBack.hDc指的是memory中的那份背景圖

5.picBack.BackColor = RGB(255, 255, 255)
  設picBack的背景是白色,如此也會同時也使Window background Color變成白色,這邊要提出說明的是,vb的BackColor指的是什麼大家都知道,但Window中的BackGround Color卻不太相同,Window的BackGround Color指的是在其上畫線條或Print文字時,填充於線條或文字外面的顏色,vb中一律使用Form/pictureBox的BackColor來填充,也就是說當BackColor變了時,同時也是讓Window中所謂Background Color變,可以用以下程式一試便知:
  me.backcolor = RGB(255,255,255)
  Call SetBkColor(me.hDc, RGB(255,0,0))
  me.print "haha"

6.ColorBack = SetBkColor(picBack.hDC, TColor)
   設定PicBack的Window背景顏色成TColor,同時傳回原本的Window BackGround Color存於ColorBack(先前第5步的設定,會使這ColorBack存的是白色的值)

7.BitBlt hdcMono, 0, 0, dx, dy, picBack.hDC, 0, 0, vbSrcCopy
  將picBack的背景圖Copy 到memory DC之中,這邊有一個重點,picBack是彩色圖,但是目前記憶體Dc存的是單色的圖,這麼Copy下去的結果會變成:PicBack的BackGround Color(即Tcolor)會變成1(白色),其他顏色變成0(黑色)。注:如果memory dc的圖是彩色,就不會如此,而memory dc的圖如何變彩色,那便是Step 3. SelectObject時傳入一個彩色的hBitmap,而彩色的hBitmap又如何做到,那便是在Step 2.時CreateCompatibleBitmap的第一個叁數,不傳Memory DC,而傳一個彩色的hDc,如form1.hdc (if 是彩色螢幕)

8.Call SetBkColor(picBack.hDC, ColorBack)
  window BackGround再設回原本的ColorBack之顏色(在這里是白色)

9.BitBlt picBack.hDC, 0, 0, dx, dy, hdcMono, 0, 0, vbSrcCopy
  將Memory dc內的圖再畫回PicBack的背景圖中,相同的,單色圖如何放入彩色圖呢?原則似乎是(這是我的testing,Win32 help中沒有說明): 1(白色)會以目的hdc(在此是picack.hdc)之window Background color來填(此時是ColorBack = 白色) ,而 0(黑色)就以黑色畫上去,如此一來,一個圖的Mask不就造出來了嗎?

10.將Mask的圖放到另一個彩色的Memory DC之中
  hMaskDC = CreateCompatibleDC(0)
  hBmpMask = CreateCompatibleBitmap(picBack.hDc, dx, dy)
  Call SelectObject(hMaskDC, hBmpMask)
  BitBlt hMaskDC, 0, 0, dx, dy, picBack.hDc, 0, 0, vbSrcCopy

11.Call SelectObject(hdcMono, hbmpOld)
  因已大功告成,所以將hdcMono上的繪圖區設回原先的區域(於Step 2中記錄),不過我個人沒有這個習慣,但沒有做有沒有影響系統資源,我是半路出家,實在不知。

12.Call DeleteDC(hdcMono)
  刪除記憶體 DC,這沒做就不好了。

13.Call DeleteObject(hbmpMono)
  刪除Bitmap,這沒做就不好了。

'以下在form 需二個PictureBox,一個Image Control, 一個Command Box
Private Sub Command1_Click()
Dim dx As Long, dy As Long

Call GetInvertMaskPic(Picture1, Image1, RGB(0, 0, 255))
'請確認相對pen.bmp圖的背景顏色是什麼,本例中是藍色,故使用RGB(0,0,255)
Call GetMaskPic(Picture1, Image1, RGB(0, 0, 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:\pen.bmp") '請自行設定您的圖
Set Picture2.Picture = LoadPicture("c:\bkpic.bmp") '請設定成自己的背景圖
End Sub


Private Sub Form_Unload(Cancel As Integer)
  Call DeleteDC(hMaskDC)
  Call DeleteObject(hBmpMask)
  Call DeleteDC(hInvertMaskDC)
  Call DeleteObject(hBmpInvertMask)

End Sub



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

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 91成人在线视频观看| 亚洲免费在线播放视频| 日本女人高潮视频| 999精彩视频| 亚洲国产精品毛片av不卡在线| 成年女人18级毛片毛片免费| 永久免费看av| 国产香蕉一区二区三区| av磁力番号网| 久久男人资源站| 国产精品视频网站在线观看| av影院在线播放| 日韩国产成人无码av毛片| 久久亚洲国产成人精品无码区| 91制片厂免费观看| 色一情一乱一乱一区91| 在线观看17c| 国产日本在线播放| 日av中文字幕| 色一情一区二区| 最新中文字幕久久| 国产女教师bbwbbwbbw| 成人黄色大片网站| 国产午夜伦鲁鲁| 国产一二三区av| 特黄特黄一级片| 欧美精品一区二区三区三州| 可以在线看的黄色网址| 91av视频免费观看| 九九久久九九久久| aa在线免费观看| 亚洲av无日韩毛片久久| 日韩一级片一区二区| 日本不卡在线观看视频| jizzzz日本| 亚洲小视频在线播放| 日本精品一区二区三区四区| 1314成人网| 欧美老熟妇喷水| 久久av秘一区二区三区| 日本免费不卡一区二区| 欧美一级视频在线| 18禁网站免费无遮挡无码中文| 亚洲77777| av在线观看地址| 日韩成人精品视频在线观看| 无码 制服 丝袜 国产 另类| 久久久久久久久久久久91| 福利视频一区二区三区四区| 一女二男3p波多野结衣| 亚洲熟妇无码另类久久久| 波多野结衣三级在线| 国产一级特黄a大片免费| 久久观看最新视频| 天天操天天干天天做| 日韩精品一区二区三区色欲av| 好吊色这里只有精品| 日韩一级免费片| 青青青国产在线视频| 久久精品国产sm调教网站演员| 特色特色大片在线| 污网站在线免费| 国产一二三四在线视频| 韩国一区二区av| www.爱色av.com| 欧美成人三级在线视频| 欧美乱做爰xxxⅹ久久久| 国产手机视频在线观看| 国产免费中文字幕| 在线观看日本一区二区| 国产一二三四在线视频| 任你操这里只有精品| 超碰影院在线观看| 又色又爽又高潮免费视频国产| 日本中文字幕片| 精品这里只有精品| 欧美牲交a欧美牲交aⅴ免费真| 国产a级片网站| 色综合av综合无码综合网站| 日韩精品免费播放| 国产一二三四在线视频| 欧美日韩久久婷婷| 青青在线视频免费观看| 加勒比成人在线| 大香煮伊手机一区| 美女网站色免费| 精品久久免费观看| 岛国大片在线播放| 亚洲色欲综合一区二区三区| 91国产精品视频在线观看| 日本少妇高潮喷水视频| 成年丰满熟妇午夜免费视频 | 波多野结衣三级在线| 狠狠干狠狠操视频| 婷婷视频在线播放| 黄色大片中文字幕| 欧美日韩在线成人| 色中文字幕在线观看| 欧美午夜小视频| 国产又大又黄又粗的视频| 肉色超薄丝袜脚交| 久久久久久www| 亚洲一区精品视频在线观看| 久久久久久久9| a在线观看免费视频| 免费在线精品视频| 男人天堂999| 玖玖精品在线视频| 久草青青在线观看| 日韩欧美理论片| 日韩 欧美 高清| www.18av.com| 欧美大尺度做爰床戏| 极品粉嫩国产18尤物| 91亚洲免费视频| 免费看国产一级片| 视频免费1区二区三区| 超碰成人免费在线| 污污视频网站在线| aaa毛片在线观看| www婷婷av久久久影片| 在线观看免费的av| 国产a级一级片| 热99这里只有精品| 国产探花在线观看视频| 日韩精品无码一区二区三区免费 | 亚洲娇小娇小娇小| 黄色一级视频片| 少妇久久久久久被弄到高潮| www午夜视频| 欧美性猛交久久久乱大交小说| 黄色大片中文字幕| 337p亚洲精品色噜噜狠狠p| 中文字幕55页| 五月天开心婷婷| 天天看片天天操| 怡红院亚洲色图| 亚洲黄色片免费| 女人高潮一级片| 五月天综合婷婷| 最新中文字幕久久| 无码人妻精品一区二区三区99v| 亚洲高清在线不卡| gogogo免费高清日本写真| aaa一级黄色片| 国产成人三级视频| 老司机激情视频| 国产精品网站免费| aaa毛片在线观看| 99免费视频观看| 国产精品视频分类| 999在线精品视频| 美女黄色片网站| 日韩欧美猛交xxxxx无码| 麻豆tv在线播放| 日本成人黄色网| 国产永久免费网站| 日本三日本三级少妇三级66| 日韩最新中文字幕| 九九爱精品视频| 中文字幕第17页| 大片在线观看网站免费收看| 欧美在线一区视频| 三年中国国语在线播放免费| 日韩av自拍偷拍| 日本精品久久久久久久久久| 91蝌蚪视频在线观看| 一级日本黄色片| 亚洲午夜无码av毛片久久| 性chinese极品按摩| 激情六月天婷婷| 92看片淫黄大片一级| 天天爱天天做天天操| 国产91在线免费| 青青草影院在线观看| 黄色片视频在线播放| 懂色av粉嫩av蜜臀av| 国产熟人av一二三区| 丰满人妻一区二区三区53号| av免费网站观看| 久久综合久久网| 久久免费视频2| 日韩av播放器| 国产中文字幕免费观看| 日本三日本三级少妇三级66| 人妻无码视频一区二区三区| 日本黄xxxxxxxxx100| 亚洲视频一二三四| 欧美日韩中文在线视频| 狠狠精品干练久久久无码中文字幕| 三级a在线观看| 人妻熟妇乱又伦精品视频| 亚洲色图都市激情| xxx中文字幕| 中文字幕亚洲影院| 爱情岛论坛vip永久入口| 日本三区在线观看| 成人免费在线小视频| 黄色一级在线视频| 婷婷无套内射影院|