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