哪个是读取闭合多边形内部位图像素颜色的最佳方法?
闭合多边形定义为位图尺寸中的System.Drawing.Point列表。我正在使用C#和.NET Framework。
感谢。
答案 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查找多边形内的所有水平线。然后简单地计算。这些的颜色。