仅渲染任意形状对象的轮廓
本文关键字:对象 轮廓 任意形 | 更新日期: 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