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

C# 如何读取闭合多边形内的像素?,c#,.net,C#,.net,读取闭合多边形内位图像素颜色的最佳方法是什么 闭合多边形定义为位图尺寸中System.Drawing.Point的列表。我正在使用C#和.NET框架 谢谢。据我所知,c#默认情况下不提供此功能。最简单的方法可能是创建第二个白色背景的图像,在那里你可以用黑色像素填充多边形。然后扫描整个第二幅图像中的黑色像素,并在同一坐标下从原始图像中读取每个黑色像素 如果多边形是大型图像的一小部分,这当然会很慢,但您可以轻松确定多边形落下的边界,并仅为该区域创建贴图 另一种方法是扫描一条从(-1,0)到(宽度+1

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

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

谢谢。

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

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

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

一种可能的方法是创建Drawing2D.GraphicsPath的实例并通过添加点,然后使用GraphicsPath作为构造函数的参数创建一个区域

然后,根据多边形适合使用的最小矩形执行命中测试

此方法比创建第二个位图更有效,但速度可能不如创建第二个位图快

这是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坐标,您将拥有仍然包含整个多边形的最小矩形。然后可以尝试使用查找多边形内的所有水平线。然后简单地计算它们的颜色。

多边形内通常有多个像素。你想要所有图像的颜色,平均值,还有其他吗?@Marcelo:我想全部读取。你可以根据多边形的最小值/最大值创建一个较小的位图,这样大图像就不会有太大的性能问题。