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

本文关键字:多边形 像素 何读取 读取 | 更新日期: 2023-09-27 18:35:08

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

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

谢谢。

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

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

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

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

一种可能的方法是创建一个 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 坐标,则将拥有仍包含整个多边形的最小矩形。然后,您可以尝试使用高效的多边形填充算法来查找多边形中的所有水平线。然后简单地计算这些的颜色。