我正在处理图像编辑程序。我设法弄清楚如何从图像中选择一个矩形,但我也喜欢手绘选择工具。手绘选择,复制手绘选定区域在c#
我把选择的所有点都收集到一个列表中,这对绘图来说足够了,但我需要能够确定图像的哪些部分在选择范围之外以及其内部是什么。
此外,我需要一种方法来确保选择不会自己交叉,或者如果发生这种情况,交叉部分会合并到选择中。
我不想找人为我做,但我甚至不知道从哪里开始寻找答案。
有没有图书馆或首选的方法来做到这一点?
我的代码:
MouseMove事件:
if (mdown)
{
cut_points.Add(e.Location);
foreach(Point p in cut_points)
{
if (p.X < cut.X || cut.X == -1) { cut.X = p.X; }
if (p.Y < cut.Y || cut.Y == -1) { cut.Y = p.Y; }
if (p.X > cut.X + cut.Width) { cut.Width = p.X - cut.X; }
if (p.Y > cut.Y + cut.Height) { cut.Height = p.Y - cut.Y; }
}
this.Invalidate();
}
抽奖活动:
using (Brush br = new SolidBrush(Color.FromArgb(120, Color.White)))
{
e.Graphics.FillRectangle(br, new Rectangle(0, 0, Width, Height));
}
//Freehand
for (int i = 0; i < cut_points.Count; i++)
{
if(i < cut_points.Count - 1)
{
e.Graphics.DrawLine(Pens.Blue, cut_points[i], cut_points[i + 1]);
e.Graphics.DrawLine(Pens.Blue, new Point(cut_points[i].X + 1, cut_points[i].Y), new Point(cut_points[i + 1].X + 1, cut_points[i + 1].Y));
e.Graphics.DrawLine(Pens.Blue, new Point(cut_points[i].X, cut_points[i].Y + 1), new Point(cut_points[i + 1].X, cut_points[i + 1].Y + 1));
}
else
{
e.Graphics.DrawLine(Pens.Blue, cut_points[i], cut_points[0]);
e.Graphics.DrawLine(Pens.Blue, new Point(cut_points[i].X + 1, cut_points[i].Y), new Point(cut_points[0].X + 1, cut_points[0].Y));
e.Graphics.DrawLine(Pens.Blue, new Point(cut_points[i].X, cut_points[i].Y + 1), new Point(cut_points[0].X, cut_points[0].Y + 1));
}
}
e.Graphics.DrawRectangle(Pens.Black, cut);
查找(https://en.wikipedia.org/wiki/Point_in_polygon)和多边形相交的算法。 –
@ OlivierJacot-Descombes感谢您的提示!我会研究一下 – WolfyD
您应该看看__powerful GraphicsPath__及其各种方法!如果线路连续,也尽量避免单独的DrawLine调用;而是使用DrawLines。对于freehande的选择考虑使用DrawCurve。 – TaW