【问题标题】:C# fill out side of a polygonC# 填充多边形的边
【发布时间】:2017-04-03 12:44:59
【问题描述】:

在 c# 中,我可以在位图图像中填充多边形,如下所示。

        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.FillPolygon(colorBrush, points.ToArray());
        }

FillPolygon 方法填充多边形内的像素,在这种情况下,白色像素和黑色像素保持不变。

现在,我想要这个操作的反面。这意味着,外部像素将被填充,而内部像素将保持不变。在这种情况下,黑色像素是外部像素。

编辑 我需要这个,因为假设我有一个对象的二进制图像。我需要用背景颜色(黑色)裁剪像素,白色多边形内的像素将保持不变。

【问题讨论】:

  • 您可以执行 2 次操作。意思是第一次通过,创建这个位图。第二遍:当生成的位图中的像素为黑色时,填充其他位图中的像素。
  • 使用白色背景并将多边形填充为黑色有什么问题吗?
  • 我没试过,但你可以尝试在你的多边形点中包含位图的角。如果它起作用,它将产生多边形内的所有东西都变成外部的效果,并且会产生相同的结果。
  • 这里,只考虑白色像素是像素,我不能改变。现在我需要用特定颜色替换多边形外的像素

标签: c# image-processing bitmap polygon


【解决方案1】:

您可以使用GraphicsPath 来执行此操作,如下所示:

  1. 将多边形添加到路径中。
  2. 在包含您要“反转”的区域的路径中添加一个矩形。
  3. 使用Graphics.FillPath() 填充路径。

对于示例程序,创建一个默认的 Windows 窗体应用并覆盖 OnPaint(),如下所示:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    var points = new []
    {              
        new PointF(150, 250),
        new PointF( 50, 500),
        new PointF(250, 400),
        new PointF(300, 100),
        new PointF(500, 500),
        new PointF(500,  50),
    };

    using (var path = new GraphicsPath())
    {
        path.AddPolygon(points);

        // Uncomment this to invert:
        // p.AddRectangle(this.ClientRectangle);

        using (var brush = new SolidBrush(Color.Black))
        {
            e.Graphics.FillPath(brush, path);
        }
    }
}

如果您运行它(并调整窗口大小),您会在一个白色窗口内看到一个黑色形状。

取消注释指示的行并运行程序,您将在黑色窗口内看到一个白色形状(即添加 ClientRectangle 反转它)。

【讨论】:

  • 正是我需要的。开箱即用。谢谢。