none
Profil d'intensité lumineuse en fonction d'une ligne

    Question

  • Bonjour à tous,

    Je souhaiterai tracer le profil de l'intensité lumineuse des pixels d'une image par rapport à une ligne tracée par l'utilisateur dans la pictureBox. Je trace déjà le profil de l'intensité lumineuse de l'image normalement (l'axe des abscisses représente la largeur de l'image et l'axe des ordonnées représente l'intensité de l'image).

    Maintenant j'aimerai tracer le profil en fonction d'une ligne que l'utilisateur peut tracer dans la pictureBox.

    J'ai déjà le code pour tracer le profil de base et j'ai également le code pour tracer la ligne dans la pictureBox. Je n'arrive pas vraiment à afficher le profil en fonction de cette ligne donc j'aurai voulu savoir si quelqu'un avait une solution à mon problème !

    Merci d'avance,

    Sebbur 

    mercredi 6 juillet 2016 12:31

Réponses

  • Bonjour,
    Vous pouvez consulter mon exemple à cette adresse:

    https://code.msdn.microsoft.com/Analyse-image-affichage-de-ded85c5c

    La description est bâclée, je la modifierai plus tard, mais j'espère que cela vous donnera des idées.

    Je complèterai ce soir la fonction de l'évènement MouseMove de PICTdiagram
    par l'affichage d'un rectangle autour du pixel (sur PICTimage).

    Si l'exemple vous convient, n'hésitez pas à voter ici et dans l'exemple, ça fait toujours plaisir.

    Cordialement

    Gérard

    jeudi 7 juillet 2016 07:02
  • Modifier le code suivant

    private void PICTBimage_MouseClick(object sender, MouseEventArgs e)
            {
                m_Curseur = new PointF(e.X, e.Y);
                m_PtPixel = new PointF(e.X - m_XminIMG, e.Y);
                switch (e.Button)
                {
                    case MouseButtons.Left:
                        switch (m_Action)
                        {
                            case EAction.SaisiePt1:
                                //m_PT1 = new PointF(e.X, e.Y);


                               if ( (m_XminIMG <= e.X) && (e.X <= m_XmaxIMG))  
                                {

    -----Ligne à modifier, e.X à la place de m_XminIMG
                                    m_PT1 = new PointF(m_XminIMG, e.Y);
    -----Ligne à modifier

                                    m_Action = EAction.SaisiePT2;

    -----Lignes à supprimer
                                   if ((e.X - m_XminIMG) > 5)
                                    {
                                        m_Polyligne.ajouterSegment(m_PT1, new PointF(e.X, e.Y));
                                        m_PT1 = new PointF(e.X, e.Y);
                                        PICTBimage.Refresh();
                                    }
    -----Lignes à supprimer
                               }
                                break;

    dans la fonction

    private void MNUarreter(object sender, EventArgs e)
            {
                m_PolyligneDyn.LstSegment.Clear();
    -----Ligne à supprimer
               m_Polyligne.ajouterSegment(m_PT1, new PointF(m_XminIMG + PICTBdiagram.Width, m_PT1.Y));
    -----Ligne à supprimer

                m_Commande = ECommande.Aucune;
                m_Action = EAction.Aucune;
                PICTBimage.Refresh();
                afficherIntensite();
            }

    • Proposé comme réponse GP79 jeudi 7 juillet 2016 07:48
    • Marqué comme réponse Sebbur lundi 18 juillet 2016 06:24
    jeudi 7 juillet 2016 07:48

Toutes les réponses

  • Bonjour,

    J'ai publié un exemple de tracé de courbe avec conversion unité dessin/unité d'affichage.

    https://code.msdn.microsoft.com/Control-utilisateur-41cbfb14

    Cordialement

    Gérard

    mercredi 6 juillet 2016 12:36
  • Merci pour votre réponse.
    J'ai téléchargé votre exemple et c'est très intéressant. En revanche j'ai une question par rapport à mon application.
    Le ligne est donc tracée par l'utilisateur, et je souhaiterai récupérer les valeurs de l'intensité des pixels aux points de cette ligne pour pouvoir ensuite afficher le profil. Avez-vous une idée de comment je peux réaliser cela ?

    Sebbur

    mercredi 6 juillet 2016 12:44
  • Oui, je vais vous faire un petit exemple.

    Vous l'aurez demain.

    Gérard


    • Modifié GP79 mercredi 6 juillet 2016 12:50
    mercredi 6 juillet 2016 12:50
  • D'accord je vous remercie, c'est sympa.

    Bonne journée,

    Sebbur

    mercredi 6 juillet 2016 12:57
  • Voici le code pour tracer les profils simples :

    private List<int> _colIntensities = new List<int>();
            private List<int> _rowIntensities = new List<int>();
    
            // l'événement du bouton qui lance le calcul
            private void checkBox2_CheckedChanged(object sender, EventArgs e)
            {
    
                Image img = pictureBox.Image; // Image.FromFile(_picFilename);
                using (Bitmap bmp = new Bitmap(img))
                {
    
                    #region intensités par colonne
                    _colIntensities.Clear();
                    for (int col = 0; col < bmp.Width; col++)
                    {
                        double total = 0;
                        for (int lin = 0; lin < bmp.Height; lin++)
                        {
                            Color clr = bmp.GetPixel(col, lin);
                            total += clr.R + clr.G + clr.B;
                        }
                        total /= (3 * 255);
                        _colIntensities.Add(Convert.ToInt32(total));
                    }
                    #endregion
    
                    #region intensités par ligne
                    _rowIntensities.Clear();
                    for (int row = 0; row < bmp.Height; row++)
                    {
                        double total = 0;
                        for (int col = 0; col < bmp.Height; col++)
                        {
                            Color clr = bmp.GetPixel(col, row);
                            total += clr.R + clr.G + clr.B;
                        }
                        total /= (3 * 255);
                        _rowIntensities.Add(Convert.ToInt32(total));
                    }
                    #endregion
                    pictureBox.Refresh();
    
                }
            }


    Et l'évènement Paint de la pictureBox :

    private void pictureBox_Paint(object sender, PaintEventArgs e) { if (checkBox2.Checked) { // GRAPHE HORIZONTAL VERTICAL PictureBox ctrl = (PictureBox)sender; Image img = pictureBox.Image; Graphics g = e.Graphics; Pen p = new Pen(Color.Red, 2); g.Clear(Color.White); g.DrawImage(img, 0, 0, img.Width, img.Height); ctrl.Width = img.Width; ctrl.Height = img.Height; ctrl.BorderStyle = BorderStyle.FixedSingle; p.Color = Color.White;

    for (int i = 0; i < _rowIntensities.Count - 1; i++) g.DrawLine(p, _rowIntensities[i], i, _rowIntensities[i + 1], i + 1); for (int i = 0; i < _colIntensities.Count - 1; i++) g.DrawLine(p, i, img.Height - _colIntensities[i], i + 1, img.Height - _colIntensities[i + 1]); }

    Et du coup j'aimerai faire pareil mais par rapport à une ligne tracée aléatoirement dans la pictureBox par l'utilisateur. Lorsqu'il a fini de tracer sa ligne une fenêtre s'ouvrirait et afficherait le profil par exemple.

    Merci pour votre aide et bonne journée,

    Sebbur




    • Modifié Sebbur mercredi 6 juillet 2016 13:08
    mercredi 6 juillet 2016 13:06
  • Bonjour,
    Vous pouvez consulter mon exemple à cette adresse:

    https://code.msdn.microsoft.com/Analyse-image-affichage-de-ded85c5c

    La description est bâclée, je la modifierai plus tard, mais j'espère que cela vous donnera des idées.

    Je complèterai ce soir la fonction de l'évènement MouseMove de PICTdiagram
    par l'affichage d'un rectangle autour du pixel (sur PICTimage).

    Si l'exemple vous convient, n'hésitez pas à voter ici et dans l'exemple, ça fait toujours plaisir.

    Cordialement

    Gérard

    jeudi 7 juillet 2016 07:02
  • Bonjour,

    Je vous remercie pour votre exemple, je vais aller regarder tout ça et je vous en donnerai des nouvelles ! 

    A plus tard,

    Sebbur 

    jeudi 7 juillet 2016 07:06
  • Votre code est très intéressant et il répond à mes questions.
    En revanche, comment je peux faire pour permettre à l'utilisateur de tracer la ligne tout simplement, sans que la ligne soit reliée horizontalement sur les côtés ?

    Voici mon code pour tracer la ligne et en fait j'aimerai ensuite tracer le profil d'intensité lumineuse des pixels par rapport uniquement à cette ligne. Est-ce que c'est possible de faire ça ? Ou je suis obligé de d'abord relier la ligne sur les côtes ?

    Encore une fois merci pour vos réponses,

    Sebbur

    jeudi 7 juillet 2016 07:29
  • Modifier le code suivant

    private void PICTBimage_MouseClick(object sender, MouseEventArgs e)
            {
                m_Curseur = new PointF(e.X, e.Y);
                m_PtPixel = new PointF(e.X - m_XminIMG, e.Y);
                switch (e.Button)
                {
                    case MouseButtons.Left:
                        switch (m_Action)
                        {
                            case EAction.SaisiePt1:
                                //m_PT1 = new PointF(e.X, e.Y);


                               if ( (m_XminIMG <= e.X) && (e.X <= m_XmaxIMG))  
                                {

    -----Ligne à modifier, e.X à la place de m_XminIMG
                                    m_PT1 = new PointF(m_XminIMG, e.Y);
    -----Ligne à modifier

                                    m_Action = EAction.SaisiePT2;

    -----Lignes à supprimer
                                   if ((e.X - m_XminIMG) > 5)
                                    {
                                        m_Polyligne.ajouterSegment(m_PT1, new PointF(e.X, e.Y));
                                        m_PT1 = new PointF(e.X, e.Y);
                                        PICTBimage.Refresh();
                                    }
    -----Lignes à supprimer
                               }
                                break;

    dans la fonction

    private void MNUarreter(object sender, EventArgs e)
            {
                m_PolyligneDyn.LstSegment.Clear();
    -----Ligne à supprimer
               m_Polyligne.ajouterSegment(m_PT1, new PointF(m_XminIMG + PICTBdiagram.Width, m_PT1.Y));
    -----Ligne à supprimer

                m_Commande = ECommande.Aucune;
                m_Action = EAction.Aucune;
                PICTBimage.Refresh();
                afficherIntensite();
            }

    • Proposé comme réponse GP79 jeudi 7 juillet 2016 07:48
    • Marqué comme réponse Sebbur lundi 18 juillet 2016 06:24
    jeudi 7 juillet 2016 07:48
  • Ca marche très bien ! C'est exactement ce que je voulais, merci beaucoup !

    J'ai essayé de l'intégrer à mon application, mais en revanche j'ai quelques erreurs.
    Apparemment, " X " et " Y " ne contiendrait pas de définition.

     Voici le code en question :

    private void pictureBox_Click(object sender, EventArgs e)
            {
                m_Curseur = new PointF(e.X, e.Y);
                m_PtPixel = new PointF(e.X - m_XminIMG, e.Y);
                switch (e.Button)
                {
                    case MouseButtons.Left:
                        switch (m_Action)
                        {
                            case EAction.SaisiePt1:
                                //m_PT1 = new PointF(e.X, e.Y);
                                if ((m_XminIMG <= e.X) && (e.X <= m_XmaxIMG))
                                {
                                    m_PT1 = new PointF(e.X, e.Y); // Modifiée
                                    m_Action = EAction.SaisiePT2;
                                    /* if ((e.X - m_XminIMG) > 5)
                                     {
                                         m_Polyligne.ajouterSegment(m_PT1, new PointF(e.X, e.Y));
                                         m_PT1 = new PointF(e.X, e.Y);
                                         PICTBimage.Refresh();
                                     }*/
                                }
                                break;
                            case EAction.SaisiePT2:
                                if (e.X > m_PT1.X)
                                {
                                    m_Polyligne.ajouterSegment(m_PT1, new PointF(e.X, e.Y));
                                    m_PT1 = new PointF(e.X, e.Y);
                                    pictureBox.Refresh();
                                }
                                break;
                        }
    
                        break;
                    case MouseButtons.Right:
                        ContextMenu l_Ctxtmnu = new ContextMenu();
                        switch (m_Commande)
                        {
                            case ECommande.Polyligne:
                                l_Ctxtmnu.MenuItems.Add(new MenuItem("Arrêter", new EventHandler(MNUarreter)));
                                break;
                            default:
                                l_Ctxtmnu.MenuItems.Add(new MenuItem("Dessiner", new EventHandler(MNUdessiner)));
                                break;
                        }
    
                        l_Ctxtmnu.Show(pictureBox, e.Location);
                        break;
                }
            }

    J'ai mis en gras les instructions soulignées.
    Est-ce que j'ai oublié de déclarer quelque chose ?

    Merci encore pour votre aide !

    Sebbur

    jeudi 7 juillet 2016 08:25
  • Il faut mettre le code sur l'évènement MouseClick

    private void pictureBox1_MouseClick(object sender, MouseEventArgs e)

    La classe MouseEventArgs contient les membres X et Y et location également dans lequel vous retrouver les coordonnées du curseur.

    • Proposé comme réponse GP79 jeudi 7 juillet 2016 08:48
    jeudi 7 juillet 2016 08:48
  • Mais oui c'était logique ! Je me suis trompé d'évènement et j'ai pas fait attention.

    Je n'ai plus d'erreurs, mais lorsque je lance mon application et que je veux dessiner ma ligne pour visualiser le profil, ma ligne ne se trace pas lorsque j'effectue les clics et lorsque j'effectue le clic pour finir ma ligne, une exception apparaît disant :

    " Une exception non gérée du type 'System.ArgumentNullException' s'est produite dans PylonLiveView.exe

    Informations supplémentaires : La valeur ne peut pas être null. "

    C'est certainement dû au fait que la ligne ne se trace pas.

    Sebbur

    jeudi 7 juillet 2016 09:09
  • Il faut montrer le code de la fonction "Arrêter" et, il faut peut être modifier le code de pictureBox_Paint

    jeudi 7 juillet 2016 09:52
  • J'ai un peu modifié le code et ça me paraissait bon.
    Voici le code du menu " Arrêter " :

     private void MNUarreter(object sender, EventArgs e)
            {
                m_PolyligneDyn.LstSegment.Clear();
                //m_Polyligne.ajouterSegment(m_PT1, new PointF(m_XminIMG + PICTBdiagram.Width, m_PT1.Y));
                m_Commande = ECommande.Aucune;
                m_Action = EAction.Aucune;
                pictureBox.Refresh();
                afficherIntensite();
            }

    Et voici le code de l'évènement Paint de ma pictureBox :

    private void pictureBox_Paint(object sender, PaintEventArgs e)
            {
                // Tracé de profil en fonction de la ligne 
    
                Pen l_Stylo = new Pen(Color.LightCyan, 3.0F);
                foreach (Segment l_Seg in m_Polyligne.LstSegment)
                {
                    e.Graphics.DrawLine(l_Stylo, l_Seg.Pt1, l_Seg.Pt2);
                }
    
                l_Stylo = new Pen(Color.Red, 3.0F);
                foreach (Segment l_Seg in m_PolyligneDyn.LstSegment)
                {
                    e.Graphics.DrawLine(l_Stylo, l_Seg.Pt1, l_Seg.Pt2);
                }
            }
    Sebbur

    jeudi 7 juillet 2016 10:01
  • Bonjour,

    Alors dans mon évènement Paint de la pictureBox, j'ai le code suivant :

    Pen l_Stylo = new Pen(Color.LightCyan, 3.0F);
                foreach (Segment l_Seg in m_Polyligne.LstSegment)
                {
                    e.Graphics.DrawLine(l_Stylo, l_Seg.Pt1, l_Seg.Pt2);
                }
    
                l_Stylo = new Pen(Color.Red, 3.0F);
                foreach (Segment l_Seg in m_PolyligneDyn.LstSegment)
                {
                    e.Graphics.DrawLine(l_Stylo, l_Seg.Pt1, l_Seg.Pt2);
                }

    Mais lorsque je lance mon application et que je veux tracer une ligne dans la pictrueBox, la ligne ne se trace pas et du coup au second clic une exception intervient disant que la valeur ne peut pas être nulle.

    Je pense que cette exception vient du fait que la ligne ne se trace pas, mais je ne vois pas pourquoi celle-ci ne se dessine pas.

    EDIT : Voici également le code de l'évènement " MouseClick " de la pictureBox :

     private void pictureBox_MouseClick(object sender, MouseEventArgs e)
            {
                m_Curseur = new PointF(e.X, e.Y);
                m_PtPixel = new PointF(e.X - m_XminIMG, e.Y);
                switch (e.Button)
                {
                    case MouseButtons.Left:
                        switch (m_Action)
                        {
                            case EAction.SaisiePt1:
                                //m_PT1 = new PointF(e.X, e.Y);
                                if ((m_XminIMG <= e.X) && (e.X <= m_XmaxIMG))
                                {
                                    m_PT1 = new PointF(e.X, e.Y); // Modifiée
                                    m_Action = EAction.SaisiePT2;
                                    if ((e.X - m_XminIMG) > 5)
                                     {
                                         m_Polyligne.ajouterSegment(m_PT1, new PointF(e.X, e.Y));
                                         m_PT1 = new PointF(e.X, e.Y);
                                         pictureBox.Refresh();
                                     }
                                }
                                break;
                            case EAction.SaisiePT2:
                                if (e.X > m_PT1.X)
                                {
                                    m_Polyligne.ajouterSegment(m_PT1, new PointF(e.X, e.Y));
                                    m_PT1 = new PointF(e.X, e.Y);
                                    pictureBox.Refresh();
                                }
                                break;
                        }
    
                        break;
                    case MouseButtons.Right:
                        ContextMenu l_Ctxtmnu = new ContextMenu();
                        switch (m_Commande)
                        {
                            case ECommande.Polyligne:
                                l_Ctxtmnu.MenuItems.Add(new MenuItem("Arrêter", new EventHandler(MNUarreter)));
                                break;
                            default:
                                l_Ctxtmnu.MenuItems.Add(new MenuItem("Dessiner", new EventHandler(MNUdessiner)));
                                break;
                        }
    
                        l_Ctxtmnu.Show(pictureBox, e.Location);
                        break;
                }
            }

    Merci d'avance,

    Sebbur



    • Modifié Sebbur mardi 12 juillet 2016 10:01
    mardi 12 juillet 2016 09:33
  • J'ai essayé de modifier un peu le code et j'ai relu tout le code du code exemple et le mien dans mon programme.

    Cependant, le tracé de ligne ne s'effectue toujours pas et du coup mon profil ne se trace pas non plus. Lorsque je veux tracer la ligne, la ligne ne se trace pas dans la pictureBox et quand je finis mon tracé de ligne, l'exception suivante apparaît encore :

    " Une exception non gérée du type 'System.ArgumentNullException' s'est produite dans PylonLiveView.exe

    Informations supplémentaires : La valeur ne peut pas être null. "

    Quelqu'un aurait une idée à mon problème ?

    Merci d'avance,

    Sebbur

    lundi 18 juillet 2016 09:29
  • Bonjour,

    Il faut faire attention aux coordonnées. PictureBox est plus grand que l'image. C'est pourquoi il y a un contrôle

    if ((m_XminIMG <= e.X) && (e.X <= m_XmaxIMG))

    Si ces 2 conditions ne sont pas remplies, le point n'est pas pris en compte. En plus, dans votre code, au premier point vous tracer un trait de longueur nulle.

    sur l'évènement Mouseclick,

    case EAction.SaisiePt1:


    si vous ne voulez pas tracer de ligne horizontale du bord de l'image jusqu'au curseur,
    vous devez retirer l'instruction suivante:

    if ((e.X - m_XminIMG) > 5)
     {
        m_Polyligne.ajouterSegment(m_PT1, new PointF(e.X, e.Y));
        m_PT1 = new PointF(e.X, e.Y);
        pictureBox.Refresh();
      }

    Dans l'évènement mouseMove, vous devez tester si m_Pt1 != null

    Cordialement

    Gérard


    lundi 18 juillet 2016 10:19
  • J'ai pris en compte vos indications mais la ligne ne se trace toujours pas selon le déplacement de la souris.

    Quand je finalise ma ligne, une ligne horizontale apparaît au sommet de ma pictureBox partant du bord jusqu'à la coordonnée finale en X de la ligne que j'aimerai tracer. Tout de suite après ça, l'exception apparaît.
    Vous m'avez indiqué que dans mon code, au premier point je traçais une ligne de longueur nulle. Je ne vois pas exactement où c'est.

    lundi 18 juillet 2016 11:18
  • Dans l’évènement MouseClick


    case EAction.SaisiePt1: //m_PT1 = new PointF(e.X, e.Y); if ((m_XminIMG <= e.X) && (e.X <= m_XmaxIMG)) { m_PT1 = new PointF(e.X, e.Y); // Modifiée m_Action = EAction.SaisiePT2; if ((e.X - m_XminIMG) > 5) { m_Polyligne.ajouterSegment(m_PT1, new PointF(e.X, e.Y)); m_PT1 = new PointF(e.X, e.Y); pictureBox.Refresh(); } } break;

    m_PT1 = new PointF(e.X, e.Y);

    et vous tracer

    m_Polyligne.ajouterSegment(m_PT1, new PointF(e.X, e.Y));

    Montrer le code complet de MouseClick, MouseMove et la fonction afficherIntensite

    lundi 18 juillet 2016 15:38
  • Voici le code de MouseClick :

    private void pictureBox_MouseClick(object sender, MouseEventArgs e)
            {
                m_Curseur = new PointF(e.X, e.Y);
                m_PtPixel = new PointF(e.X - m_XminIMG, e.Y);
                switch (e.Button)
                {
                    case MouseButtons.Left:
                        switch (m_Action)
                        {
                            case EAction.SaisiePt1:
                                //m_PT1 = new PointF(e.X, e.Y);
                                if ((m_XminIMG <= e.X) && (e.X <= m_XmaxIMG))
                                {
                                    m_PT1 = new PointF(e.X, e.Y); // Modifiée
                                    m_Action = EAction.SaisiePT2;
                                    /*if ((e.X - m_XminIMG) > 5)
                                     {
                                         m_Polyligne.ajouterSegment(m_PT1, new PointF(e.X, e.Y));
                                         m_PT1 = new PointF(e.X, e.Y);
                                         pictureBox.Refresh();
                                     }
                                     */
                                }
                                break;
                            case EAction.SaisiePT2:
                                if (e.X > m_PT1.X)
                                {
                                    m_Polyligne.ajouterSegment(m_PT1, new PointF(e.X, e.Y));
                                    m_PT1 = new PointF(e.X, e.Y);
                                    pictureBox.Refresh();
                                }
                                break;
                        }
    
                        break;
                    case MouseButtons.Right:
                        ContextMenu l_Ctxtmnu = new ContextMenu();
                        switch (m_Commande)
                        {
                            case ECommande.Polyligne:
                                l_Ctxtmnu.MenuItems.Add(new MenuItem("Arrêter", new EventHandler(MNUarreter)));
                                break;
                            default:
                                l_Ctxtmnu.MenuItems.Add(new MenuItem("Dessiner", new EventHandler(MNUdessiner)));
                                break;
                        }
    
                        l_Ctxtmnu.Show(pictureBox, e.Location);
                        break;
                        
                }
            }

    Voici le code de MouseMove :

    private void pictureBox2_MouseMove(object sender, MouseEventArgs e)
            {
    
                PointF ptx = new PointF(e.X, e.Y);
    
                //Mettre en commentaire la définition de _TEST au début du fichier pour la mise au point du programme
    #if _OK
                switch (m_Action)
                {
                    case EAction.Aucune:
                        if (m_Polyligne.LstSegment.Count > 0)
                        {
                            try
                            {
                                Segment l_Seg = m_Polyligne.getSegmentAtX(e.X);
                                Int32 l_Y = l_Seg.getOrdonneeAtX(e.X, m_XminIMG);
                                Bitmap l_Image = (Bitmap)pictureBox.Image;
                                Color l_Couleur = l_Image.GetPixel(e.X - m_XminIMG, l_Y);
    
                                /*
                                Graphics l_Grph = Graphics.FromImage(PICTBcouleurR.Image);
                                l_Grph.Clear(Color.FromArgb(l_Couleur.R, 0, 0));
                                PICTBcouleurR.Refresh();
                                TBOXr.Text = string.Format("R = {0:D}", l_Couleur.R);
    
                                l_Grph = Graphics.FromImage(PICTBcouleurG.Image);
                                l_Grph.Clear(Color.FromArgb(0, l_Couleur.G, 0));
                                PICTBcouleurG.Refresh();
                                TBOXg.Text = string.Format("G = {0:D}", l_Couleur.G);
    
                                l_Grph = Graphics.FromImage(PICTBcouleurB.Image);
                                l_Grph.Clear(Color.FromArgb(0, 0, l_Couleur.B));
                                PICTBcouleurB.Refresh();
                                TBOXb.Text = string.Format("B = {0:D}", l_Couleur.B);
                                
    
                                TBOXposition.Text = string.Format("Pixel {0:D} , {1:D}", new object[] { e.X - m_XminIMG, l_Y });
                                */
                            }
                            catch
                            {
    
                            }
                        }
                        break;
                    default:
                        break;
                }
    #endif
            }


    Et pour finir le code de la fonction afficherIntensite() :

    void afficherIntensite()
            {
                Bitmap l_Image = (Bitmap)pictureBox.Image;
                Graphics grPh = Graphics.FromImage(pictureBox2.Image);
                grPh.Clear(Color.LightCoral);
                Bitmap xx = (Bitmap)pictureBox2.Image;
                foreach (Segment l_Seg in m_Polyligne.LstSegment)
                {
                    Int32 l_XD = Convert.ToInt32(l_Seg.Pt1.X) - m_XminIMG;
                    Int32 l_XF = Convert.ToInt32(l_Seg.Pt2.X) - m_XminIMG;
    
                    for (int l_X = l_XD; l_X < l_XF; l_X++)
                    {
                        //X et Y de l'image originale
                        Int32 l_Y = l_Seg.getOrdonneeAtX(Convert.ToDouble(l_X), m_XminIMG);
                        Color l_Coul = l_Image.GetPixel(l_X, l_Y);
                        double l_Intensite = Convert.ToDouble(l_Coul.R + l_Coul.G + l_Coul.B) / (3.0 * 255.0);
    
                        //calcul de Y sur l'image Diagram
                        l_Y = Convert.ToInt32(l_Intensite * Convert.ToDouble(xx.Height));
                        for (int ky = 0; ky < l_Y; ky++)
                        {
                            xx.SetPixel(l_X, 79 - ky, Color.DarkBlue); //79 - ky ==> à cause de l'axe Y orienté vers le bas
                        }
                    }
                }
            }

    Merci pour toutes vos réponses et de prendre le temps de m'aider,

    Sebbur

    lundi 18 juillet 2016 16:31
  • J'ai revérifié mon code et j'ai à nouveau parcouru votre code en exemple afin de trouver une solution à mon problème.

    Malheureusement je n'ai pas trouvé d'où vient mon problème donc la ligne ne se trace toujours pas lorsque je veux la tracer avec mon curseur. Et du coup quand je fais clic droit " arrêter ", il y a toujours la même exception qui apparaît.

    jeudi 21 juillet 2016 12:33
  • Bonjour

    J'ai mis à jour l'exemple pour ne pas tracer de complément horizontal au début et à la fin.

    Si vous voulez rétablir le traçage du complément, il suffit de mettre de supprimer la mise en commentaire de la ligne suivante:

    //#define _COMPLETE_DEBUTFIN_H

    Cordialement

    Gérard

    dimanche 24 juillet 2016 09:51
  • Bonjour,

    D'accord je vais aller voir ça ! 

    Merci beaucoup pour votre aide !

    Je vous tiendrai au courant lorsque j'aurai essayé l'affichage du profil !

    Merci encore et bonne journée !

    Sebbur

    • Modifié Sebbur dimanche 24 juillet 2016 12:45
    dimanche 24 juillet 2016 12:44
  • Bonjour,

    Alors voilà j'ai regardé et analysé votre exemple et il fonctionne très bien !

    J'ai alors essayé de réaliser ceci dans mon programme mais lorsque je clique droit et je clique sur " arrêter " il y a toujours la même exception qui apparaît. En revanche, maintenant la ligne se trace et suit les clics de ma souris !

    Mais je ne sais pas pourquoi le diagramme ne se trace pas et une exception apparaît !

    Merci d'avance,

    Sebbur

    lundi 25 juillet 2016 07:33
  • J'ai parcouru votre code et j'ai regardé avec le mien.

    J'aimerais tracer le profil de l'image que je capture avec la caméra, donc je n'initialise pas de photo dans mon code, mais je mets le nom de ma PictureBox.
    Etant donné que je capture une image avec une caméra, vous pensez que le problème peut venir de là ?

    Merci de votre aide,

    Sebbur

    mardi 26 juillet 2016 09:53
  • Bonjour,

    Vous devez faire un pas à pas pour voir ou est le problème.
    Le problème est certainement dans la fonction d'affichage du diagramme.
    Pouvez vous la montrer?

    Gérard

    mardi 26 juillet 2016 09:59
  • J'ai fait un pas à pas détaillé mais je n'ai pas trouvé d'où venait le problème.

    Voici la fonction " afficherIntensite() " :

    void afficherIntensite()
            {
                Bitmap l_Image = (Bitmap)pictureBox.Image;
                Graphics grPh = Graphics.FromImage(pictureBox2.Image);
                grPh.Clear(Color.LightCoral);
                Bitmap xx = (Bitmap)pictureBox2.Image;
                foreach (Segment l_Seg in m_Polyligne.LstSegment)
                {
                    Int32 l_XD = Convert.ToInt32(l_Seg.Pt1.X) - m_XminIMG;
                    Int32 l_XF = Convert.ToInt32(l_Seg.Pt2.X) - m_XminIMG;
    
                    for (int l_X = l_XD; l_X < l_XF; l_X++)
                    {
                        //X et Y de l'image originale
                        Int32 l_Y = l_Seg.getOrdonneeAtX(Convert.ToDouble(l_X), m_XminIMG);
                        Color l_Coul = l_Image.GetPixel(l_X, l_Y);
                        double l_Intensite = Convert.ToDouble(l_Coul.R + l_Coul.G + l_Coul.B) / (3.0 * 255.0);
    
                        //calcul de Y sur l'image Diagram
                        l_Y = Convert.ToInt32(l_Intensite * Convert.ToDouble(xx.Height));
                        for (int ky = 0; ky < l_Y; ky++)
                        {
                            xx.SetPixel(l_X, 79 - ky, Color.DarkBlue); //79 - ky ==> à cause de l'axe Y orienté vers le bas
                        }
                    }
                }
            }

    Merci d'avance,

    Sebbur


    • Modifié Sebbur mardi 26 juillet 2016 12:03
    mardi 26 juillet 2016 11:35
  • Votre programme marche très bien pourtant !
    Mais lorsque je le mets dans mon programme, il y a toujours la même exception qui survient. Pourtant il me semble avoir tout modifié comme il le fallait.
    L'erreur vient peut-être du fait que je capture une image avec une caméra et que je n'initialise pas d'image directement dans le code ?

    Sebbur

    mercredi 27 juillet 2016 09:43