在图像上绘制圆形

3
我有一个使用WinForms应用程序C#进行图像分割的程序,并在pictureBox中加载了一张图片。我需要在图像上绘制一个小圆圈(或椭圆,不重要)(在兴趣区域内,并允许其向外扩展直到达到所需边界)。
问题是如何在图像的任何位置绘制该圆圈?(如果可以以不同颜色绘制该圆圈,例如红色)
谢谢。
2个回答

3

确保获取控件的图形实例并在其上绘制。只有在重绘或无效时才会反映出来。使用Graphic Class的DrawEllipse Method来绘制圆形。

以下是代码:

Graphics gf = picturebox1.CreateGraphics();
//A circle with Red Color and 2 Pixel wide line
gf.DrawEllipse(new Pen(Color.Red, 2),new Rectangle(0, 0, 200, 200));

使其无效以在控件(picturebox)上实际绘制它。
picturebox1.Invalidate();

它将绘制一个直径为200像素的圆。

我遇到了这个错误:'System.Drawing.Rectangle' 是一个 '类型',但被用作 '变量'。 - Bosco
哎呀,抱歉忘记在矩形前加上 new 关键字了... 我已经修改了代码。 - Shekhar_Pro
这会在左上角创建一个圆,而我想自己画那个圆... - Bosco
你正在自己创建圆形...在Rectangle(0, 0, 200, 200)中。第一个参数是控件上的X位置,第二个参数是Y位置,然后第三个参数是宽度,第四个参数是高度。只需指定您想要其左上角的XY位置即可...如果您想通过某些算法逐点绘制圆,则使用GraphicsPath对象绘制路径并用来自算法的点填充它...我不会这样做...看起来您真的是初学者,那么我建议您阅读一些好书或查看MSDN文档...我就是这样学习的。 - Shekhar_Pro

2

参考资料:来自@Albin在draw-an-arrow-on-a-picturebox的回答。

public partial class Form1 : Form
{
    private bool isMoving = false;
    private Point mouseDownPosition = Point.Empty;
    private Point mouseMovePosition = Point.Empty;
    private Dictionary<Point, Point> Circles = new Dictionary<Point, Point>();
    public Form1()
    {
        InitializeComponent();

        // 
        // pictureBox1
        //             
        this.pictureBox1.Name = "pictureBox1";
        this.pictureBox1.Size = new System.Drawing.Size(231, 235);
        this.pictureBox1.TabIndex = 0;
        this.pictureBox1.TabStop = false;
        this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);
        this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseDown);
        this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove);
        this.pictureBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseUp);
        this.Controls.Add(this.pictureBox1);
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        Pen p = new Pen(Color.Red);
        var g = e.Graphics;
        if (isMoving)
        {
            g.Clear(pictureBox1.BackColor);
            g.DrawEllipse(p, new Rectangle(mouseDownPosition, new Size(mouseMovePosition.X - mouseDownPosition.X, mouseMovePosition.Y - mouseDownPosition.Y)));
            foreach (var circle in Circles)
            {
                g.DrawEllipse(p, new Rectangle(circle.Key, new Size(circle.Value.X - circle.Key.X, circle.Value.Y - circle.Key.Y)));
            }
        }
    }

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        pictureBox1.Cursor = Cursors.Cross;
        isMoving = true;
        mouseDownPosition = e.Location;
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isMoving)
        {
            mouseMovePosition = e.Location;
            pictureBox1.Invalidate();
        }
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        pictureBox1.Cursor = Cursors.Default;
        if (isMoving)
        {
            Circles.Add(mouseDownPosition, mouseMovePosition);
        }
        isMoving = false;
    }
}

非常感谢...这个方法成功绘制出了pictureBox中的椭圆形...但是当我想要在之前加载到pictureBox中的图片上进行绘制时,只有椭圆形会出现...是否可能让椭圆形和图片同时出现在pictureBox中?如果可以,那么是否可以使椭圆形动起来并作用于图片上?(我是在感兴趣区域内绘制椭圆形,需要它向外生长直到达到该感兴趣区域的期望边界)。如果不行,我还有哪些其他选择? - Bosco
我已经自己解决了,我没有看到“g.Clear(pictureBox1.BackColor); ”...删除它就可以了... - Bosco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接