Je travaille sur un programme d'édition d'images. J'ai réussi à trouver comment sélectionner un rectangle à partir d'une image, mais j'aimerais aussi un outil de sélection à main levée. Je devais aller jusqu'à rassembler tous les points de la sélection dans une liste et cela suffirait pour dessiner, mais je dois être capable de déterminer quelles parties de l'image sont en dehors de la sélection et ce qu'il y a dedans.Sélection à main levée, copie de la zone sélectionnée à main levée dans C#
J'ai aussi besoin d'un moyen de m'assurer que la sélection ne se croise pas elle-même, ou si cela se produit, pour que la partie croisée soit fusionnée dans la sélection.
Je ne cherche pas quelqu'un pour le faire pour moi mais je ne sais même pas par où commencer à chercher la réponse.
Existe-t-il une bibliothèque ou un moyen préféré de le faire?
Mon code:
L'événement 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();
}
L'événement du tirage:
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);
Rechercher [Point algorithme de polygone] (https://en.wikipedia.org/wiki/Point_in_polygon) et des algorithmes intersection du polygone. –
@ OlivierJacot-Descombes Merci pour le conseil! Je vais regarder dans ce – WolfyD
Vous devriez regarder dans le __powerful GraphicsPath__ et ses diverses méthodes! essayez également d'éviter des appels DrawLine séparés si les lignes doivent être continues; utilisez plutôt DrawLines. Et pour la sélection à main levée, pensez à utiliser DrawCurve. – TaW