2012-05-23 27 views
2

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

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

谢谢。

+0

多边形内通常有多个像素。你想要所有人的颜色,平均值,还有其他的吗? –

+0

@Marcelo:我想读他们都 – abenci

回答

1

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

当然,这将是缓慢的,如果多边形是一个大的图像的一小部分,但你可以很容易地确定在哪个多边形落在界,只有创建地图该区域。

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

+0

您可以创建基于最小/最大多边形的较小的位图,这样大的图像就不会这么大一个性能问题。 – Kogitsune

+1

@Kogitsune更新了我的答案 –

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 

这仅仅是简单的例子代码,但应在整个的想法。

0

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