2013-06-26 72 views
0

我正在使用WPF和C#,並且我正在使用不透明蒙版將圖像剪出來。我現在只需要得到這個人的輪廓,並刪除該人的實際圖像,以便只保留輪廓。僅渲染任意形狀的對象的輪廓

我發現我可以使用陰影效果來獲得類似人物輪廓的東西(這足以滿足我的目的,但隨意提出更好的方法)。但是,我不知道如何刪除其他人,以便只保留輪廓/陰影?

回答

1

這幾個月太晚了,但也許這會幫助你或其他人。我來到這裏尋求幾乎同一主題的幫助,但有一個區別:我已經找到了答案。對於我的目的而言,這很簡單,但對於較大圖像(> 800 * 600)來說太慢了,所以我正在尋找更有效率的東西 - 看起來似乎沒有多少機會。

首先,使用CopyPixels獲取圖像(或不透明蒙版)的字節數組。定義一個PathGeometry。然後對於通過測試的每個像素(在我的情況下,alpha> 0),向PathGeometry添加1 * 1像素的RectangleGeometry。然後使用PathGeometry.GetOutlinedPathGeometry將形狀的輪廓作爲幾何體來獲取。

這是我在VB.Net中寫的一個函數,它可以幫助你通過插圖。

Public Function GetImageOutline(bi As BitmapImage) As Geometry 
    Dim stride As Integer = bi.PixelWidth * 4 
    Dim height As Integer = bi.PixelHeight 
    Dim pg As New PathGeometry With {.FillRule = FillRule.Nonzero} 
    Dim pixels(height * stride - 1) As Byte 
    bi.CopyPixels(pixels, stride, 0) 
    For i As Integer = 0 To pixels.Count - 1 Step 4 
     '\\\Find non-transparent pixels (Alpha > 0): 
     If pixels(i + 3) > 0 Then 
      Dim x As Double = (i Mod stride) \ 4 
      Dim y As Double = Math.Floor(i/stride) 
      Dim pixG As New RectangleGeometry(New Rect(x, y, 1, 1)) 
      pg.AddGeometry(pixG) 
     End If 
    Next 
    Return pg.GetOutlinedPathGeometry() 
End Function