从图像中选择特定区域



是否有适用于winform或wpf的.net免费库,可以控制选择图像中的特定区域,然后我们可以将这些区域保存为不同的图像。如果我们可以用鼠标在图像上绘制一个网格,然后将该网格保存为单独的图像,那就太好了。

这不是很难。在Winforms中,这里有一个最小的例子:

GraphicsPath GP = null;
List<Point> points = new List<Point>();
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    points.Clear();
    points.Add(e.Location);
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    GP = new GraphicsPath();
    GP.AddClosedCurve(points.ToArray());
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        points.Add(e.Location);
        pictureBox1.Invalidate();
    }
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    if (points.Count > 1)
        e.Graphics.DrawCurve(Pens.Orange, points.ToArray(), 0.5f);
}
private void cb_clearRegion_Click(object sender, EventArgs e)
{
    points.Clear();
    pictureBox1.Region = null;
}
private void cb_SaveRegion_Click(object sender, EventArgs e)
{
    Rectangle cr = pictureBox1.ClientRectangle;
    using (Bitmap bmp = new Bitmap(cr.Width, cr.Height))
    using (Graphics G = Graphics.FromImage(bmp))
    {
        G.SetClip(GP);
        G.DrawImage(pictureBox1.Image, Point.Empty);
        bmp.Save(@"D:xyz.png", ImageFormat.Png);
    }
}

请注意,这不使用放大或缩小,而是创建与原始大小相同的位图,只是在区域外的任何地方都是透明的。

使用ScaleTransformPoint UnZoom(Point)函数实现azoom是微不足道的;只要问问你是否需要它。

如果您想添加"移动"模式,可以使用MouseMove并重新计算所有Points

如果您想要多个区域,则必须收集一个List<T>并依次使用它们来创建输出。

如果您真的只想保存网格而不想保存图像,请使用G.DrawPath(..)而不是DrawImage()

还要注意,您可能需要使用各种绘图工具,如直线、矩形等来细化选择。您可以将地物增量添加到路径中。。

相关内容

  • 没有找到相关文章

最新更新