我正在使用WPF和C#,我正在使用不透明蒙版从图像中删除一个人。我现在只需要获取此人的轮廓并删除该人的实际图像,以便仅保留轮廓。
我发现我可以使用一个drophadow-effect来获得类似于人物轮廓的东西(这足以满足我的目的,但可以随意提出一个更好的方法)。但是,我不知道如何删除剩下的人,以便只留下轮廓/阴影?
答案 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