如何读取闭合多边形内的像素?

时间:2012-05-23 09:49:31

标签: c# .net

哪个是读取闭合多边形内部位图像素颜色的最佳方法?

闭合多边形定义为位图尺寸中的System.Drawing.Point列表。我正在使用C#和.NET Framework。

感谢。

3 个答案:

答案 0 :(得分:1)

据我所知,默认情况下c#不提供此功能。最简单的方法可能是创建一个白色背景的第二个图像,其中FillPolygon多边形为黑色像素。然后扫描整个第二个图像以查找黑色像素,并从同一坐标处的原始图像中读取每个黑色像素。

如果多边形是大图像的一小部分,这当然会很慢,但您可以轻松确定多边形落入的边界,并仅为该区域创建一个地图。

另一种方法是从(-1,0)到(宽度+ 1,0)扫描一条线并计算每条多边形线的交点,在交叉点之后,下一个像素在多边形内部,并在下一个交叉点之后像素在外面。然后扫描(-1,1)到(宽度+ 1,1)等。 请记住,与一个与多边形点完全匹配的点相交的线应该格外小心。

答案 1 :(得分:0)

一种可能的方法是创建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

这只是一个快速的示例代码,但应该深入了解。

答案 2 :(得分:0)

非常有趣的话题。按照Kogitsune的建议减少你的矩形听起来像是理性的第一步。但我认为你不需要一个地区。如果您只是找到所有点的最大和最小x和y坐标,那么您将拥有仍然包含整个多边形的最小矩形。然后,您可以尝试使用efficient polygon fill algorithm查找多边形内的所有水平线。然后简单地计算。这些的颜色。