IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langages Discussion :

Intensité lumineuse d'un pixel


Sujet :

Langages

  1. #21
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour


    Lorsque j'affiche le graphe dans pictureBox (dans la même pictureBox que la photo), le graphe ne suit pas le zoom.
    C'est bon ,tu y est presque ...Le graphe ne suit pas parce que ton Multiplayer est appliquée à ton image( resize) ce qui exige d'appeler de recalculer la courbe donnee par jopomk qui tient compte de la hauteur de l'mage dans sa norme....

    Une autre methoe de zoom qui tient compte directement de la taille d'image mise à l'echelle(zoom- ou zoom+) est d'utiliser les transformations de GDI+....

    De plus pour dessiner ,j'utiliser le Graphics du Control obtenu via son Handle de Fenetre ...
    Le code revu qui :
    Step 1:
    -charge l'image
    -la resize pour l'ajuster au picbox
    -calcule le list<> des intentensites
    Step 2:
    - transform le systeme de coords GDI au facteur d'echelle (scale entre 200 et 25 %) avec un transform GDI
    - dessine l'image
    - dessine les Axes OX et OY décales de 5 pixel pour la visiblite
    - dessine le graphe suivant la methode de calcul donnee par jopmok


    Ingredients : tes 2 boutons de Zoom ,un bouton Redraw et un picturebox et l'image Jellyfish de Win 7...!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing.Drawing2D;
     
    namespace WinGraphe
    {
        public partial class FormGraphe : Form
        {
            private Bitmap img = null;
            // la liste qui contiendra les intensités
            private List<int> _intensities = new List<int>();
            public FormGraphe()
            {
                InitializeComponent();
                this.pictureBox1.BorderStyle = BorderStyle.FixedSingle;
                this.pictureBox1.SizeMode = PictureBoxSizeMode.Normal;
            }
     
     
            private void FormGraphe_Load(object sender, EventArgs e)
            {
                img = WinGraphe.Properties.Resources.Jellyfish;
                img = new Bitmap(img, this.pictureBox1.Width-5,this.pictureBox1.Height-5);//ajustement au picbox 
                ComputeIntentensity(img);
                ReDraw();
            }
            private void btnIntensisty_Click(object sender, EventArgs e)
            {
                ReDraw();
            }
            private void ReDraw()
            {
                if (img == null) return;
                using (Graphics gr = Graphics.FromHwnd (this.pictureBox1.Handle))
                {
                    // on dessine l'image
                    gr.Clear(Color.White); 
     
                    Matrix m = new Matrix();
                    m = gr.Transform;
                    m.Scale(sc/100.0f,sc/100.0f);
                    gr.Transform = m;
     
     
                    gr.DrawImage(img, 0, 0);
     
                    // dessine les Axes 
                    DrawAxis(gr);
     
                    //desine le graphe 
                    using (Pen p = new Pen(Color.WhiteSmoke, 2))
                    {
                        // on parcours la liste des intensités
                        for (int i = 0; i < _intensities.Count - 1; i++)
                        {
                            // on dessine un segment entre chaque point, en inversant les ordonnées pour que les hautes intensités soient en haut
                            gr.DrawLine(p, i, img.Height - _intensities[i], i + 1, img.Height - _intensities[i + 1]);
                        }
                    }
     
                }
     
     
            }
            // procedure de calcul de dessin deporte des Axes 
            private void DrawAxis(Graphics grfx)
            { 
                using(Pen axisPen = new Pen(Brushes.Red ,2.0f))
    	        {
                    axisPen.DashStyle = DashStyle.DashDot;
                    grfx.DrawLine(axisPen,new Point(5,img.Height-5),new Point(img.Width-5,img.Height-5)); //axe vertical OX
                    grfx.DrawLine(axisPen, new Point(5, 5), new Point(5, img.Height - 5)); //axe vertical OY
     
    	        }
     
     
     
            }
            // procedure de calcul de jopomk
            private void ComputeIntentensity(Bitmap bmp)
            {
                // on efface les éventuelles valeurs déjà insérées dans la liste
                _intensities.Clear();
                // pour chaque colonne
                for (int col = 0; col < bmp.Width; col++)
                {
                    double total = 0;
                    // pour chaque ligne
                    for (int lin = 0; lin < bmp.Height; lin++)
                    {
                        // on fait la somme des composantes RGB
                        Color clr = bmp.GetPixel(col, lin);
                        total += clr.R + clr.G + clr.B;
                    }
                    // on normalise pour obtenir des valeurs comprises entre 0 et img.Height
                    total /= (3 * 255);
                    // on ajoute la valeur convertie en int à notre liste
                    _intensities.Add(Convert.ToInt32(total));
                }
     
            }
     
     
            private float sc = 100.0f;
            private float inc = 10.0f;
            private void button1_Click(object sender, EventArgs e)
            {
                ZoomIn(); // permet de zoomer
                ReDraw();
            }
            public void ZoomIn()
            {
                sc += inc;
                sc = (float)Math.Min(sc, 200.0);
     
            }
            private void button2_Click(object sender, EventArgs e)
            {
                ZoomOut(); // permet de dézoomer
                ReDraw();
            }
            public void ZoomOut()
            {
                sc -= inc;
                sc = (float)Math.Max(sc, 25.0);
            }
     
     
     
     
     
     
     
     
        }
    }
    bon code...

  2. #22
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 104
    Points : 30
    Points
    30
    Par défaut
    Bonjour,

    Je te remercie beaucoup pour toutes tes indications et pour ton code ! C'est bien ça que je souhaitais.
    Je vais essayer d'afficher le graphe dans une seconde pictureBox maintenant et d'afficher les axes avec une checkBox.
    Lorsqu'on zoom je vais aussi faire en sorte que le graphe et les axes n'apparaissent pas si la checkBox n'est pas cochée !

    Merci beaucoup à vous deux pour votre aide et pour le temps que vous avez prit pour m'aider !

    Sebbur

  3. #23
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 104
    Points : 30
    Points
    30
    Par défaut
    Je rencontre un petit problème à la définition de l'image. Dans mon projet, la pictureBox montre une image capturée par un périphérique branché, donc je ne peux pas définir à l'avance le nom de mon Image.
    Cette action ne fonctionne pas et du coup je ne sais pas comment faire pour que le zoom agisse sur l'image qu'affichera la pictureBox.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    img = pictureBox.Image;
    Merci d'avance,

    Sebbur

  4. #24
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    C'est incroyable ,dans le code revu donne et celui donne par jopmok ,la prop Pic.Image du PictureBox1 n'est pas utilisée et ne doit pas etre utilise...Car elle entre en conflit avec le code donne qui est base sur la peinture sur la surface du control PictureBox1 avec Graphics ...

    Si tu veux recuperer l'image capturée il faut un autre PictureBox2...comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
     
               public FormGraphe()
            {
                InitializeComponent();
                this.pictureBox1.BorderStyle = BorderStyle.FixedSingle;
                this.pictureBox1.SizeMode = PictureBoxSizeMode.Normal;
     
     
                //le pic2 qui utilise la prop image
                this.pictureBox2.BorderStyle = BorderStyle.FixedSingle;
                this.pictureBox2.SizeMode = PictureBoxSizeMode.Normal  ; 
            }
     
                private void FormGraphe_Load(object sender, EventArgs e)
            {
                 this.pictureBox2.Image = WinGraphe.Properties.Resources.Jellyfish; //image capturee
                img = (Bitmap)this.pictureBox2.Image;//image capturee
                img = new Bitmap(img, this.pictureBox1.Width - 5, this.pictureBox1.Height - 5);//ajustement au picbox 
     
                this.pictureBox2.Image = null;// on le nullifie prop Image .bon debarras!!!
                ComputeIntentensity(img);
                ReDraw();
     
            } 
     
            private void ReDraw()
            {
                if (img == null) return;
                using (Graphics gr = Graphics.FromHwnd (this.pictureBox1.Handle))
                {
                    // on dessine l'image
                    gr.Clear(Color.White); 
     
                    Matrix m = new Matrix();
                    m = gr.Transform;
                    m.Scale(sc / 100.0f, sc / 100.0f);
     
     
                    gr.Transform = m;
     
     
                    gr.DrawImage(img, 0,0);
     
                    // dessine les Axes 
                    DrawAxis(gr);
     
                    //desine le graphe 
                    using (Pen p = new Pen(Color.WhiteSmoke, 2))
                    {
                        // on parcours la liste des intensités
                        for (int i = 0; i < _intensities.Count - 1; i++)
                        {
                            // on dessine un segment entre chaque point, en inversant les ordonnées pour que les hautes intensités soient en haut
                            gr.DrawLine(p, i, img.Height - _intensities[i], i + 1, img.Height - _intensities[i + 1]);
                        }
                    }
     
     
                    // UPDATE DU PICTUREBOX2
                    using (Graphics gr2 = Graphics.FromHwnd(this.pictureBox2.Handle))
                    {
                        gr2.Clear(Color.White);
                        gr2.Transform = m;
     
     
                        gr2.DrawImage(img, 0, 0);
     
                    }
                }
     
     
     
            }
    Il faut retenir 2 choses:
    -la prop Image du PictureBox n'est zoomable que dans le cadre du "zoom integre" (SizeMode.Zoom)...
    Si on veut la zoomer il suffit de NULLIFIER prop en et redessiner le -img- ....
    -quand on dessine sur la Surface du Control (avec Graphics) l'image affichée dans la prop Image n'est pas modifiée ni concernée ...!!!


    bon code...

  5. #25
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 104
    Points : 30
    Points
    30
    Par défaut
    Bonjour,

    Je te remercie pour ta réponse, ça fonctionne très bien.
    Par contre dans mon programme je mets une pictureBox vide à la base, et je récupère une capture après le démarrage de mon périphérique. Donc je ne peux pas définir dans mon code la ressources que j'utilise, puisque je base sur l'image que je capture avec ma caméra.

    C'est la dernière chose avec laquelle je bloque .. Je m'explique un peu plus. Lors de l'exécution de mon programme, ma pictureBox est vide et lorsque je lance ma caméra j'obtiens une image. Ensuite avec cette image j'aimerai appliquer un zoom et donc tracer le graphe avec les axes. Le graphe avec les axes peuvent être tracés dans une autre pictureBox, c'est peut-être même mieux.
    J'ai déjà un zoom qui fonctionne, mais lorsqu'on zoom in/out plusieurs fois, la photo est beaucoup pixélisée.

    Merci beaucoup pour vos réponses qui me sont très utiles, et merci d'avance !

    Sebbur

  6. #26
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 104
    Points : 30
    Points
    30
    Par défaut
    Rebonjour à tous,

    Par rapport au même sujet j'aurai voulu avoir un renseignement sur une fonctionnalité.
    Je peux tracer le graphe de l'intensité lumineuse de la photo (grâce à votre aide) et j'aurai voulu savoir si c'était possible de faire exactement la même chose mais par rapport à une ligne tracé par l'utilisateur, c'est-à-dire que l'axe des abscisses serait la ligne tracé par l'utilisateur.

    Je vous remercie par avance,

    Sebbur

  7. #27
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 104
    Points : 30
    Points
    30
    Par défaut
    Rebonjour à tous,

    Je reviens vers vous pour une petite information.
    Le code pour tracer la ligne à partir de la souris fonctionne, mais maintenant je souhaiterais afficher le graphe des intensités par rapport à cette ligne.

    Voici le code de la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    int x1 = -1;
            int y1 = -1;
            int x2 = -1;
            int y2 = -1;
            bool fin2ligne = false;
     
            private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
            {
     
                if (x1 == -1)
                {
                    x1 = e.X;
                    y1 = e.Y;
                }
                else
                {
                    x2 = e.X;
                    y2 = e.Y;
                    fin2ligne = true;
                    pictureBox1.Refresh();
                }
            }
     
            private void pictureBox1_Paint(object sender, PaintEventArgs e)
            {
                Pen blackPen = new Pen(Color.Red, 3);
                if(x1 != -1)
                {
                    e.Graphics.DrawLine(blackPen, x1, y1, x2, y2);
     
                    if (fin2ligne)
                    {
                        // réinitialisation des valeurs
                        x1 = -1;
                        y1 = -1;
                        x2 = -1;
                        y2 = -1;
                    }
                }
     
     
            }
     
            private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
            {
                if (x1 == -1) return;
                x2 = e.X;
                y2 = e.Y;
                fin2ligne = false;
     
                pictureBox1.Refresh();
            }
    Je vous remercie d'avance,

    Sebbur

  8. #28
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 104
    Points : 30
    Points
    30
    Par défaut
    Bonjour à vous,

    Je reviens vers vous parce que je rencontre un petit problème et que vous avez su bien me répondre et m'aider.
    Le tracé du graphe fonctionne très bien et je vous remercie pour votre aide !

    Maintenant j'aimerai tracer ce profil d'une autre manière. Dans le code actuel, l'axe X est la largeur de l'image et l'axe Y est l'intensité de l'image.
    Dans le tracé que j'aimerai faire maintenant, j'aimerai tout simplement inverser les deux, c'est-à-dire que l'axe Y serait la hauteur de la photo et l'axe X serait l'intensité de la photo capturée. J'ai essayé de le faire mais lors du traçage du profil, une exception apparaît.

    Merci d'avance,

    Sebbur

  9. #29
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Re,

    EDIT :

    Alors voilà, en fait je fais la même chose que précédemment sauf que j'inverse mes boucles colonnes/lignes.
    Mon event bouton qui calcul les intensités (j'ai fait du c/c un peu moche et j'ai viré les comz) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    private void btnIntensisty_Click(object sender, EventArgs e) {
    	Image img = 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
    		picbxAnime.Refresh();
    	}
    }
    Pour l'affichage, dans l'event Paint (juste deux comz pour expliquer les dessins des lignes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    private void picBox_Paint(object sender, PaintEventArgs e) {
    	PictureBox ctrl = (PictureBox)sender;
    	Image img = picbxAnime.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;
     
    	for (int i = 0; i < _colIntensities.Count - 1; i++)
    		// on dessine un segment entre chaque point, en inversant les ordonnées pour que les hautes intensités soient en haut
    		g.DrawLine(p, i, img.Height -_colIntensities[i], i + 1, img.Height -_colIntensities[i + 1]);
     
    	p.Color = Color.Yellow; // une autre couleur pour différencier les tracés
    	for (int i = 0; i < _rowIntensities.Count - 1; i++)
    		// on dessine un segment entre chaque point, sans inverser : les hautes intensités soient à droite
    		g.DrawLine(p, _rowIntensities[i], i, _rowIntensities[i + 1], i + 1);
    }
    Le résultat obtenu avec l'image que j'ai utilisé la première fois :
    Nom : intensityHV.jpg
Affichages : 102
Taille : 10,9 Ko
    Plus je connais de langages, plus j'aime le C.

  10. #30
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 104
    Points : 30
    Points
    30
    Par défaut
    D'accord je te remercie !
    pas de soucis concernant les modifications.

    Mais j'avais dans l'idée en fait d'afficher le graphe d'intensité par colonne dans une pictureBox, et le graphe d'intensité par ligne dans une autre pictureBox pour pouvoir visualiser les deux graphes en même temps.

    Merci beaucoup !

    Sebbur

  11. #31
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 104
    Points : 30
    Points
    30
    Par défaut
    Merci beaucoup, j'ai refait le programme en déclarant les deux listes à ça marche !

    En revanche quand je l'ai ajouté à mon code général qui pilote la caméra, lorsque je lance mon appli la pictureBox est directement barrée en rouge avec un fond blanc.

    Tu sais où j'ai pu faire une erreur ?

    Encore merci beaucoup !

    Sebbur

  12. #32
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Certainement un problème sur l'acquisition de l'image. En fait le Paint est appelé au tout début (au premier affichage). Il est possible qu'à ce moment tu ne sois pas en capacité d'obtenir une image depuis ta source. Il me semble que c'est un problème que tu as déjà eu, nop ? Regarde dans tes précédents messages/discussion, tu y trouveras peut-être des indices.
    Plus je connais de langages, plus j'aime le C.

  13. #33
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 104
    Points : 30
    Points
    30
    Par défaut
    Oui il me semble que j'avais déjà eu ce problème !
    Avec le bouton ça ne marchait pas mais je l'ai remplacé par une checkBox et là ça marche.

    Lorsque je coche la checkBox les calculs se lancent et ensuite si la checkBox est coché je dessine les graphes.

    Merci beaucoup pour ton aide et le temps que tu as pris pour m'aider !

    Sebbur

  14. #34
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Pour ta question en MP (valeurs de certains pixels précis), tu as un exemple dans mon code lorsque je parcours les lignes/colonnes de l'image : la méthode GetPixel(x, y) de la classe Bitmap, elle te renvoie un objet de type Color.
    Plus je connais de langages, plus j'aime le C.

  15. #35
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 104
    Points : 30
    Points
    30
    Par défaut
    D'accord ça marche merci !
    Mais comment je peux faire pour récupérer tous les points de cette ligne pour ensuite tracer le graphe ?

    Sebbur

  16. #36
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Avec une boucle for ... ? Bon j'extrapole ta question car je suppose que tu veux regarder les pixels d'une droite quelconque et pas d'une ligne (horizontale). Il faut alors ressortir les cours du collège sur les fonctions affines. Ça consistera à trouver la pente (attention au signe, dans une image l'axe des ordonnées est inversé) et l'ordonnée à l'origine. Une fois que tu as ces a et b tu pourras trouver le y pour chaque x et donc récupérer le pixel à ces coordonnées.
    Plus je connais de langages, plus j'aime le C.

  17. #37
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 104
    Points : 30
    Points
    30
    Par défaut
    Exactement, je veux regarder pour ligne quelconque qui n'est pas forcément horizontal !
    Je vais voir et essayer ça ! Merci pour tes indications !

    Sebbur

  18. #38
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 104
    Points : 30
    Points
    30
    Par défaut
    Juste avant de continuer sur mon profil en fonction de la ligne, j'aimerai afficher les deux profils dans deux autres pictureBox. Les profils s'afficheraient sans l'image.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
        public partial class Form1 : Form
        {
            private List<int> _colIntensities = new List<int>();
            private List<int> _rowIntensities = new List<int>();
            public Form1()
            {
                InitializeComponent();
            }
     
            private void btnIntensisty_Click(object sender, EventArgs e)
            {
                Image img = picBox.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
                    picBox.Refresh();
                }
            }
     
            private void pictureBox1_Paint(object sender, PaintEventArgs e)
            {
                PictureBox ctrl = (PictureBox)sender;
                Graphics g = e.Graphics;
                Pen p = new Pen(Color.Red, 2);
     
                g.Clear(Color.White);         
     
                for (int i = 0; i < _colIntensities.Count - 1; i++)
                    // on dessine un segment entre chaque point, en inversant les ordonnées pour que les hautes intensités soient en haut
                    g.DrawLine(p, i, pictureBox1.Height - _colIntensities[i], i + 1, pictureBox1.Height - _colIntensities[i + 1]);
     
            }
     
            private void pictureBox2_Paint(object sender, PaintEventArgs e)
            {
                PictureBox ctrl = (PictureBox)sender;
                Graphics g = e.Graphics;
                Pen p = new Pen(Color.Red, 2);
     
                g.Clear(Color.White);
     
                ctrl.BorderStyle = BorderStyle.FixedSingle;
     
                p.Color = Color.Red; // couleur rouge du profil
                for (int i = 0; i < _rowIntensities.Count - 1; i++)
                    // on dessine un segment entre chaque point, sans inverser : les hautes intensités soient à droite
                    g.DrawLine(p, _rowIntensities[i], i, _rowIntensities[i + 1], i + 1);
            }
        }
    J'ai placé la picBox principale avec l'image et ensuite j'ai placé la pictureBox1 en bas de la picBox et la pictureBox2 à gauche de la picBox.
    Je pensais que le code était bon mais mes profils ne se tracent pas lorsque j'appuie sur le bouton.

    Sebbur

  19. #39
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Es-tu sûr que picBox.Image contient une image valide au moment du click bouton ?
    Que tu passes bien dans le using ?
    Sinon tes fonctions xxx_Paint sont-elle bien abonnées au bon events des tes PictureBox ?

    Enfin, pour que tes lignes soient tracées il faut qu'un event Paint soit déclenché. Tu peux le forcer en appelant la méthode Refresh des tes PictureBox, comme moi je le faisais à la fin du click (cf. picBox.Refresh(); dans mon code, que tu as laissé mais qui lui est inutile dans ton cas : tu ne veux pas refresh la PictureBox contenant ton image).
    Plus je connais de langages, plus j'aime le C.

  20. #40
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 104
    Points : 30
    Points
    30
    Par défaut
    Oui l'image est bien valide.
    J'ai ajouté " pictureBox1.Refresh(); " et " pictureBox2.Refresh(); " dans les deux évènements respectifs.
    Maintenant le graphe par rapport aux lignes s'affichent dans la pictureBox de gauche, mais le graphe par rapport aux colonnes ne s'affichent toujours pas.

    EDIT :

    Finalement les deux graphes s'affichent mais ça bug un peu. En bougeant la fenêtre, le profil en fonction des colonnes s'est affiché.
    Tu as une idée de comment faire pour éviter le bug ?

    Sebbur

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Harmonisation de l'intensité lumineuse d'une image
    Par BDCmm dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 29/01/2016, 23h25
  2. Intensité lumineuse et flux
    Par code_source dans le forum Images
    Réponses: 1
    Dernier message: 12/01/2011, 08h48
  3. Luminosité, l'intensité lumineuse d'un pixel.
    Par themoye dans le forum Traitement d'images
    Réponses: 6
    Dernier message: 22/12/2010, 19h48
  4. Obtenir l'intensité d'un pixel
    Par whiteboy dans le forum OpenCV
    Réponses: 6
    Dernier message: 13/08/2008, 11h03
  5. Recuperer l'intensite d'un pixel dans une image
    Par Battosaiii dans le forum Langage
    Réponses: 6
    Dernier message: 03/07/2006, 04h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo