• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    制作圖像的Mask圖

    發布: 2007-7-14 20:28 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 17次 | 進入軟件測試論壇討論

    領測軟件測試網 制作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

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>