我正在使用 WPF 和 C#,并且我正在使用不透明蒙版从图像中删除一个人。我现在只需要获取此人的轮廓并删除该人的实际图像,以便只保留轮廓。
我发现我可以使用阴影效果来获得类似于人物轮廓的东西(这足以满足我的目的,但请随意提出更好的方法)。但是,我不知道如何删除其他人,以便只保留轮廓/阴影?
我正在使用 WPF 和 C#,并且我正在使用不透明蒙版从图像中删除一个人。我现在只需要获取此人的轮廓并删除该人的实际图像,以便只保留轮廓。
我发现我可以使用阴影效果来获得类似于人物轮廓的东西(这足以满足我的目的,但请随意提出更好的方法)。但是,我不知道如何删除其他人,以便只保留轮廓/阴影?
为时已晚,但也许这会对您或其他人有所帮助。我来这里寻求几乎相同主题的帮助,但有一个区别:我已经找到了答案。对于较大图像(> 800 * 600)的目的来说,这很简单但太慢了,所以我正在寻找更有效的东西 - 似乎没有太多机会。
首先,使用 CopyPixels 获取图像的字节数组(或不透明度掩码)。定义一个 PathGeometry。然后对于通过测试的每个像素(在我的情况下,alpha > 0),将一个 1*1 像素的 RectangleGeometry 添加到 PathGeometry。然后使用 PathGeometry.GetOutlinedPathGeometry 将形状的轮廓作为 Geometry 获取。
这是我在 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