这是读取封闭多边形内位图像素颜色的最佳方法?如何读取封闭多边形内的像素?
的封闭的多边形被定义为System.Drawing.Point的位图中的维度的列表。我正在使用C#和.NET Framework。
谢谢。
这是读取封闭多边形内位图像素颜色的最佳方法?如何读取封闭多边形内的像素?
的封闭的多边形被定义为System.Drawing.Point的位图中的维度的列表。我正在使用C#和.NET Framework。
谢谢。
据我所知,C#默认情况下不提供此功能。最简单的方法可能是创建一个白色背景的第二个图像,其中有黑色像素的多边形。然后,您扫描整个第二个图像的黑色像素,并从原始图像中的相同坐标读取每个黑色像素。
当然,这将是缓慢的,如果多边形是一个大的图像的一小部分,但你可以很容易地确定在哪个多边形落在界,只有创建地图该区域。
另一种方法是扫描一条从(-1,0)到(宽度+ 1,0)的直线,并计算与每条多边形线的交点,下一个像素位于多边形内部之后,以及下一个交点之后像素在外面。然后扫描(-1,1)到(宽度+ 1,1)等。 请记住,与精确匹配多边形点的点相交的线应特别小心。
您可以创建基于最小/最大多边形的较小的位图,这样大的图像就不会这么大一个性能问题。 – Kogitsune
@Kogitsune更新了我的答案 –
可能的方法是创建Drawing2D.GraphicsPath的实例并通过GraphicsPath.AddLines(PointF[])添加点,然后使用GraphicsPath作为构造函数的参数创建一个区域。
然后,执行根据您的多边形使用Region.IsVisible(x, y, graphicsobject)适合的最小矩形命中测试。
这种方法将一定程度上比创建第二位图更有效,但可能不会那么快。
这是VB,但容易翻译:
Dim path As New GraphicsPath
path.AddLines(YourPointsArray)
path.CloseFigure()
Dim rgn As New Region(path)
'Find your min/max box based on YourPointsArray here
For y As Integer = min.Y To max.Y
For x as Integer = min.X To max.X
If rgn.IsVisible(x, y, YourGraphicsObject) Then
'Do what you need to do
End If
Next
Next
这仅仅是简单的例子代码,但应在整个的想法。
非常有趣的话题。按照Kogitsune的建议缩小矩形听起来像是一个理性的第一步。但我认为你不需要一个区域。如果您只是找到所有点的最大和最小x和y坐标,则会有最小的矩形仍包含整个多边形。然后,您可以尝试使用efficient polygon fill algorithm来查找多边形内的所有水平线。然后简单地计算。这些颜色。
多边形内通常有多个像素。你想要所有人的颜色,平均值,还有其他的吗? –
@Marcelo:我想读他们都 – abenci