仅渲染任意形状对象的轮廓

时间:2013-06-26 15:03:34

标签: c# wpf transparency outline

我正在使用WPF和C#,我正在使用不透明蒙版从图像中删除一个人。我现在只需要获取此人的轮廓并删除该人的实际图像,以便仅保留轮廓。

我发现我可以使用一个drophadow-effect来获得类似于人物轮廓的东西(这足以满足我的目的,但可以随意提出一个更好的方法)。但是,我不知道如何删除剩下的人,以便只留下轮廓/阴影?

1 个答案:

答案 0 :(得分:1)

这已经太晚了几个月,但也许这会对你或其他人有所帮助。我来到这里寻找几乎相同的主题的帮助,但有一个区别:我已经找到了答案。这对于我的目的来说很简单但是速度太慢而且图像较大(> 800 * 600),所以我正在寻找更高效的东西 - 似乎没那么多的机会。

首先,使用CopyPixels获取Image(或不透明蒙版)的字节数组。定义PathGeometry。然后,对于通过测试的每个像素(在我的情况下,alpha> 0),将1 * 1像素RectangleGeometry添加到PathGeometry。然后使用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