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

本文关键字:对象 轮廓 任意形 | 更新日期: 2023-09-27 18:19:56

我正在使用WPF和C#,我正在使用不透明度遮罩从图像中剪切出一个人。我现在只需要得到这个人的轮廓,并删除那个人的实际图像,这样只剩下轮廓。

我发现我可以使用阴影效果来获得类似于人物轮廓的东西(这足以满足我的目的,但可以随意提出更好的方法)。然而,我不知道如何删除该人的其余部分,以便只保留轮廓/阴影?

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

现在已经晚了几个月,但这可能会对你或其他人有所帮助。我来这里寻求几乎相同主题的帮助,但有一点不同:我已经找到了答案。它很简单,但对于我使用更大的图像(>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