2

读取封闭多边形内位图像素颜色的最佳方法是什么?

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

谢谢。

4

3 回答 3

1

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

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

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

于 2012-05-23T10:26:46.707 回答
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

这只是快速示例代码,但应该可以理解。

于 2012-05-23T11:29:48.860 回答
0

很有趣的话题。按照 Kogitsune 的建议缩小矩形听起来是合理的第一步。但我认为你不需要一个区域。如果您只是找到所有点的最大和最小 x 和 y 坐标,您将拥有仍然包含整个多边形的最小矩形。然后,您可以尝试使用高效的多边形填充算法来查找多边形内的所有水平线。然后简单地计算。这些颜色。

于 2016-06-14T11:35:42.527 回答