Partage
  • Partager sur Facebook
  • Partager sur Twitter

Dessiner des flèches sur des images

    18 août 2019 à 19:12:12

    Bonsoir à tous,

    Je souhaite insérer dans une form plusieurs images et dessiner dessus des flèches.

    Je dessine sur la première image deux flèches... par exemple Quand je passe à la deuxième image, je perd une flèche sur la première image ! Apres plusieurs passages sur les images et au final j’obtiens l'image ci dessous. Un gros mélange !!

    Voici mon code, les images sont sélectionnées et insérées dans la form, j'enregistrement pour chaque image son nom, les coordonnées des points de flèches. Mais j'ai l'impression que je ne fais pas comme il faut avec l’événement paint.

    using Object_XML_Serializer;
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Windows.Forms;
    using XML_données;
    
    namespace XML_image4
    {
        public partial class Form1 : Form
        {
            #region declaration
    
            //clsResize _form_resize;
    
            //variable pour la création des images
            private int NImage = 0;
            private int x = 0;
            PictureBox CustomerPictureBox;
            
    
            //variable pour la création des fleches sur images
            private bool isMoving = false;
            private Point mouseDownPosition = Point.Empty;
            private Point mouseMovePosition = Point.Empty;
            private List<Tuple<Point, Point>> lines;
            private List<Tuple<Point, Point>> lines1;
    
            private List<string> liste_noms_Images = new List<string>();
            private List<Image> liste_Images = new List<Image>();
    
            private List<List<Tuple<Point, Point>>> list_lines = new List<List<Tuple<Point, Point>>>();
            private Dictionary<string,List<Tuple<Point, Point>>> list_lines_test=new Dictionary<string, List<Tuple<Point, Point>>>();
    
    
            // nom du fichier de sauvegarde xml
            private const string XML_FILE_NAME = "DonnéesObject.xml";
    
            #endregion
    
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Load_images_Click(object sender, EventArgs e)
            {
    
    
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.Multiselect = true;
                openFileDialog.RestoreDirectory = true;
    
                openFileDialog.Filter = "All picture files (*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF";
    
    
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    foreach (String file in openFileDialog.FileNames)
                        try
                        {
                            Creation_picturebox(sender, e);
    
                            CustomerPictureBox.Image = Image.FromFile(file);
                            CustomerPictureBox.Name = Path.GetFileName(file);
                            CustomerPictureBox.Tag = CustomerPictureBox.Name;
                            CustomerPictureBox.Image.Tag= CustomerPictureBox.Name;
    
                            liste_noms_Images.Add(CustomerPictureBox.Name);
                            
                            liste_Images.Add(CustomerPictureBox.Image);
    
                            lines = new List<Tuple<Point, Point>>();
                            lines1 = new List<Tuple<Point, Point>>();
                            list_lines.Add(lines);
    
                            mouseDownPosition = Point.Empty;
                            mouseMovePosition = Point.Empty;
                            lines1.Add(Tuple.Create(mouseDownPosition, mouseMovePosition));
    
                            list_lines_test.Add(CustomerPictureBox.Name, lines1);
    
                        }
    
                        catch (Exception ex)
                        {
                            MessageBox.Show("Il y a un problème... " + file.Substring(file.LastIndexOf('\\'))
                                    + " ...L'utilisateur ne dispose pas des autorisations appropriées pour lire les fichiers, les chemins d'accès, etc. "
                                    + ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
                            throw;
                        }
    
                }
                else
                {
                    MessageBox.Show("Selectionner au moins une image", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
    
                }
    
    
            }
            private void Creation_picturebox(object sender, EventArgs e)
            {
    
                CustomerPictureBox = new PictureBox();
                    if (CustomerPictureBox!=null)
                    {
    
                    try
                    {
                        NImage++;
    
                        x = (215 * NImage) + 3 * (NImage - 1);
                        
                        CustomerPictureBox.BorderStyle = BorderStyle.None;
                        CustomerPictureBox.Location = new Point(x, 3);
                        CustomerPictureBox.ContextMenuStrip = contextMenuStrip1;              
                        activerToolStripMenuItem.Visible = false;
                        supprimerToolStripMenuItem.Visible = false;
                        flecheToolStripMenuItem1.Visible = false;
                        CustomerPictureBox.Size = new Size(215, 190);
                        CustomerPictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
                        CustomerPictureBox.TabIndex = 1;
                        CustomerPictureBox.TabStop = false;
                        CustomerPictureBox.Visible = true;
                         
                        CustomerPictureBox.Click += new EventHandler(picture_Click);
    
                        conteneur_images.Controls.Add(CustomerPictureBox);
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("Il y a un problème " + e + "'!", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
                        throw;
                    }
    
    
                }
    
            }
    
            private Donnees CreateFichier()
            {
                Donnees new_donnees = new Donnees();
                {
    
                    new_donnees.DateTimeValue = DateTime.Now;
                    
                    // index est à -1 car les listes commence à 0, il permettra de recuperer la valeur de l'index de liste 
                    int index = -1;
                    
    
                    for (int i = 0; i < liste_Images.Count; i++)
                    {
                        Donnees.ToutesLesImages Images0 = new Donnees.ToutesLesImages();
    
                        index++;
    
                        //ElementAt retourne l'element d'un index specifique, ici on verifie que l'index existe
                        if (liste_Images.ElementAt(index) != null)
                        {
                            //ElementAt retourne l'element d'un index specifique, ici l'index de index++
                            Images0.NameImage = liste_noms_Images.ElementAt(index);
    
                            if (liste_Images.ElementAt(index)!=null)
                            {
                                Images0.Picture = (Bitmap)liste_Images.ElementAt(index);
                            }
    
                            //verification que la liste de tupples (de point) est au mini egale à 1
                            if (lines.Count>=1)
     
                            {
                                
                                Images0.Pointxml = "P1X1=" + lines.ElementAt(index).Item1.X.ToString() + "," + "P1Y1=" + lines.ElementAt(index).Item1.Y.ToString() + ";"
                                                            + "P2X2=" + lines.ElementAt(index).Item2.X.ToString() + "," + "P2Y2=" + lines.ElementAt(index).Item2.Y.ToString() + "|";
                            }
                            
     
                        }
    
                        else
                        {
                            return null;
                        }
    
                        new_donnees.LesImages.Add(Images0);
                    }
    
    
                }
    
    
                return new_donnees;
            }
    
    
            private void picture_Click(object sender, EventArgs e)
            {
                CustomerPictureBox.Invalidate();
                
                CustomerPictureBox.BackColor = SystemColors.Control;
    
                PictureBox info_picture = sender as PictureBox;
    
                CustomerPictureBox = info_picture;
                CustomerPictureBox.BackColor = Color.Red;
                CustomerPictureBox.Padding = new Padding(5);
    
                activerToolStripMenuItem_Click(sender, e);
    
                CustomerPictureBox.Focus();
    
                }
    
    
    
            private void activerToolStripMenuItem_Click(object sender, EventArgs e)
            {
               
                activerToolStripMenuItem.Enabled = false;
                supprimerToolStripMenuItem.Visible = true;
                flecheToolStripMenuItem1.Visible = true;
    
            }
    
            private void flecheToolStripMenuItem1_Click(object sender, EventArgs e)
            {
    
    
                while (CustomerPictureBox.Focused)
                {
                    try
                    {
                        activerToolStripMenuItem.Visible = false;
                        supprimerToolStripMenuItem.Visible = false;
                        flecheToolStripMenuItem1.Visible = false;
    
                        CustomerPictureBox.Paint += new PaintEventHandler(CustomerPictureBox_Paint);
                        CustomerPictureBox.MouseDown += new MouseEventHandler(CustomerPictureBoxMouseDown);
                        CustomerPictureBox.MouseMove += new MouseEventHandler(CustomerPictureBoxMouseMove);
                        CustomerPictureBox.MouseUp += new MouseEventHandler(CustomerPictureBoxMouseUp);
                    }
                    catch (Exception)
                    {
    
                        throw;
                    }
    
                    break;
                }
                        
    
            }
    
            private void CustomerPictureBoxMouseMove(object sender, MouseEventArgs e)
            {
                if (isMoving)
                {
                    while (CustomerPictureBox.Focused)
                    {
                        try
                        {
                            mouseMovePosition = e.Location;
                            CustomerPictureBox.Invalidate();
                        }
                        catch (Exception)
                        {
    
                            throw;
                        }
                        break;
                    }
                    
                    
                }
            }
            private void CustomerPictureBoxMouseDown(object sender, MouseEventArgs e)
            {
                isMoving = true;
                mouseDownPosition = e.Location;
                
            }
    
            private void CustomerPictureBoxMouseUp(object sender, MouseEventArgs e)
            {
                if (isMoving)
                {
                    while (CustomerPictureBox.Focused)
                    {
                        try
                        {
                            if (list_lines_test.ContainsKey(CustomerPictureBox.Name))
                            {
    
                                lines = new List<Tuple<Point, Point>>(list_lines_test[CustomerPictureBox.Name]);
    
                                lines.Add(Tuple.Create(mouseDownPosition, mouseMovePosition));
    
                                list_lines_test[CustomerPictureBox.Name] = lines;
                                
                            }
                        }
                        catch (Exception)
                        {
    
                            throw;
                        }
                        break;
                        
                    }
    
                }
                isMoving = false;
                
    
    
            }
    
    
    
            private void CustomerPictureBox_Paint(object sender, PaintEventArgs e)
            {
    
                    var g = e.Graphics;
                    Pen p = new Pen(Color.Red, 10);
                    p.StartCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
                    g.DrawLine(p, mouseDownPosition, mouseMovePosition);
    
                    
    
                    while (CustomerPictureBox.Focused)
                    {
    
    
                      foreach (KeyValuePair<string, List<Tuple<Point, Point>>> key_list in list_lines_test)
                      {
    
    
                          if (key_list.Key == CustomerPictureBox.Name)
                          {
                              try
                              {
    
                                  foreach (var line in key_list.Value)
                                  {
                                      
                                      p.StartCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
                                      g.DrawLine(p, line.Item1, line.Item2);
                                  }
    
    
                              }
                              catch (Exception)
                              {
    
                                  throw;
                              }
    
                          }
                      }
    
                      break;
                    }
    
    
                
            }
            
        
    }


    Merci pour votre aide

    David

    • Partager sur Facebook
    • Partager sur Twitter
      30 août 2019 à 13:46:24

      Vous utilisez très très mal les champs de votre formulaire, comme "CustomerPictureBox".

      Vous avez des méthodes avec des effets de bord dans tous les coins.

      Supprimez tous ces champs qui n'ont rien à faire dans le formulaire et utilisez des variables locales le plus possible.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

      Dessiner des flèches sur des images

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown