2013-06-26 54 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