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

C# Discussion :

Zoom in/out d'une pictureBox


Sujet :

C#

  1. #1
    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 Zoom in/out d'une pictureBox
    Bonjour à tous,

    Je pilote une caméra et dans mon Form j'ai donc trois boutons d'acquisition : capture photo, capture vidéo et stop de la capture vidéo.
    L'image capturée a une résolution de 2048 px * 2048 px, donc pour pouvoir visualiser la capture entièrement dans ma fenêtre, sans devoir utiliser les " ascenseurs ", j'ai placé deux boutons de zoom in/out.
    Voici mon code pour ces deux boutons :

    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
     
            private Size Multiplier;
            private Color color = Color.Black;
     
            public void ZoomIn()
            {
                Multiplier = new Size(2, 2);
     
                Image MyImage = pictureBox.Image;
     
                Bitmap MyBitMap = new Bitmap(MyImage, Convert.ToInt32(MyImage.Width * Multiplier.Width),
                Convert.ToInt32(MyImage.Height * Multiplier.Height));
     
                Graphics Graphic = Graphics.FromImage(MyBitMap);
     
                Graphic.InterpolationMode = InterpolationMode.High;
     
                pictureBox.Image = MyBitMap;
                pictureBox.Refresh();
     
            }
     
            public void ZoomOut()
            {
                Multiplier = new Size(2, 2);
     
                Image MyImage = pictureBox.Image;
     
                Bitmap MyBitMap = new Bitmap(MyImage, Convert.ToInt32(MyImage.Width / Multiplier.Width),
                Convert.ToInt32(MyImage.Height / Multiplier.Height));
     
                Graphics Graphic = Graphics.FromImage(MyBitMap);
     
                Graphic.InterpolationMode = InterpolationMode.High;
     
                pictureBox.Image = MyBitMap;
                pictureBox.Refresh();
            }
     
     
            private void button1_Click(object sender, EventArgs e)
            {
                ZoomIn();
                pictureBox.Invalidate();
            }
     
            private void button2_Click(object sender, EventArgs e)
            {
                ZoomOut();
                pictureBox.Invalidate();
            }
    Le zoom in/out fonctionne mais j'ai un petit problème. Une fois que j'ai appuyé sur l'un des deux boutons de zoom, je ne peux plus lancer une capture directement. Il faut d'abord que je ferme mon application et que je la lance à nouveau.

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

    Avec ce zoom, la photo devient pixélisée si on zoom in/out trop de fois, mais dans mon cas ce n'est pas si grave.

    Merci d'avance,

    Sebbur

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 132
    Points : 59
    Points
    59
    Par défaut
    Bonjour,

    Pourquoi vous faites

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pictureBox.Invalidate()
    ?

    J'ai des doutes que ça soit ça la cause du problème!

    Pouvez-vous essayer


  3. #3
    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
    J'avais déjà essayé les deux méthodes, mais le problème persiste. Je ne vois pas trop comment résoudre ce problème alors je suis venu sur le forum pour avoir de l'aide

    Sebbur

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 132
    Points : 59
    Points
    59
    Par défaut
    avez-vous fait referch() au début de la capture?

    Merci!

  5. #5
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    Bonjour

    comme je l'ai déjà dit, il faut créer un controle héritant de la pictureBox et faire les choses proprement dans le OnPaint() surchargé
    de ce controle comme ça, tu controleras tout directement et proprement !

    Et du coup, tu pourras utiliser une matrice de zoom pour faire ce que tu veux, voir redimensionner les images !!!

  6. #6
    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
    Salut,

    Donc il faut que je crée un UserControl qui hérite de la pictureBox ?

  7. #7
    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
    Citation Envoyé par samuel44 Voir le message
    avez-vous fait referch() au début de la capture?

    Merci!
    Non je n'ai pas fait de Refresh() dans l'évènement du bouton qui permet de lancer la capture.

    Sebbur

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    invalidate et refresh font la même chose (l'un appelle l'autre)
    mais setter l'image (comme pictureBox.Image = MyBitMap) appelle invalidate
    ca te fait déjà quelques lignes à supprimer

    par contre comment captures tu l'image, c'est de là qu'il faudrait partir
    et c'est juste l'image que tu veux zoomer ou la vidéo aussi ?

  9. #9
    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 vais supprimer les lignes en question dans ce cas.

    Je capture l'image avec une caméra Basler et je souhaiterai appliquer le zoom sur la capture photo et sur la capture vidéo.

    Merci pour vos réponses,

    Sebbur

  10. #10
    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
    Avec mon code de zoom actuel, je peux uniquement mettre à l'échelle ma capture photo. Lorsque je met à l'échelle ma capture vidéo, le zoom s'effectue bien mais la capture s'arrête automatiquement.

    Une fois que j'ai appuyé sur l'un de mes deux boutons de zoom in/out, je ne peux plus lancer une capture (photo ou vidéo). Pour relancer une photo ou une vidéo, je dois fermer mon application et la rouvrir.
    J'avoue que ce n'est pas bien pratique.

    Comment je peux faire pour que mon zoom in/out soit également fonctionnel sur ma vidéo sans pour autant stopper ma capture ?

    Merci d'avance,

    Sebbur

  11. #11
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    Je vais le dire une dernière fois :

    Il te faut un UserControl à toi, ou tu gères toi même le paint et qui aura une méthode du genre : "SetBitmap"

    Cette méthode, tu l'appeleras dans la méthode ou tu récupères l'image issue de la vidéo et basta.

    Après, dans ton user control, tu surcharges le OnPaint() et tu choisis le zoom que tu veux avec les fonctionnalités de Graphics.

    Ca fait plusieurs postes où tu poses des questions sur des zooms, axes, etc... et où on te dit qu'un UserControl est LA solution la plus propre...

    De plus, si tu veux vraiment qu'on avance sur ton code, il faudrait peut-être qu'on voit d'où viennent les images ? parce que dans ton code,
    on voit juste des fonctions mais pas celles qui alimentent la pictureBox en image !

  12. #12
    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 de ta réponse. Tu m'avais déjà dit de faire un UserControl mais je ne voyais pas trop comment faire. Maintenant je vais voir avec les indications que tu as postées et je vais essayer tout ça.
    Je vous tiendrai au courant demain sur l'avancée et je posterai le code que tu m'as demandé.

    Merci encore pour les réponses,

    Sebbur

  13. #13
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 72
    Points : 135
    Points
    135
    Par défaut
    Salut !

    Un élément de réponse ici : http://www.codeproject.com/Articles/...ictureBox-Zoom

    C'est un peu daté, mais tout à fait fonctionnel.
    J'ai mis longtemps à le trouver, au moins 10 secondes avec mon navigateur et la recherche avec google. Mais bon, avec de la patience et une bonne dose de courage on y arrive.

    Amicalement

  14. #14
    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
    Salut DiOxy,

    Merci pour ta réponse et ton lien. Cet exemple je l'avais déjà trouvé et je l'ai déjà testé ! Effectivement ça marche bien et il est tout à fait fonctionnel, mais il ne correspond pas tout à fait à mes attentes. Mon objectif est de pouvoir zoomer et dézoomer sur la capture photo et vidéo dans la même pictureBox.

    Merci encore,

    Sebbur

  15. #15
    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
    Voici l'extrait de code qui alimente ma pictureBox :

    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
     
    /* Handles the click on the single frame button. */
            private void toolStripButtonOneShot_Click(object sender, EventArgs e)
            {
                OneShot(); /* Starts the grabbing of one image. */
            }
     
            /* Handles the click on the continuous frame button. */
            private void toolStripButtonContinuousShot_Click(object sender, EventArgs e)
            {
                ContinuousShot(); /* Start the grabbing of images until grabbing is stopped. */
            }
     
            /* Handles the click on the stop frame acquisition button. */
            private void toolStripButtonStop_Click(object sender, EventArgs e)
            {
                Stop(); /* Stops the grabbing of images. */
            }
    Et voici la définition des méthodes :

    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
     
    /* Start the grab of one image. */
            public void OneShot()
            {
                if (m_open && !m_grabThread.IsAlive) /* Only start when open and not grabbing already. */
                {
                    /* Set up the grabbing and start. */
                    m_numberOfBuffersUsed = 1;
                    m_grabOnce = true;
                    m_grabThreadRun = true;
                    m_grabThread = new Thread(Grab);
                    m_grabThread.Start();
                }
            }
     
            /* Start the grab of images until stopped. */
            public void ContinuousShot()
            {
                if (m_open && !m_grabThread.IsAlive)  /* Only start when open and not grabbing already. */
                {
                    /* Set up the grabbing and start. */
                    m_numberOfBuffersUsed = 5;
                    m_grabOnce = false;
                    m_grabThreadRun = true;
                    m_grabThread = new Thread(Grab);
                    m_grabThread.Start();
                }
            }
     
            /* Stops the grabbing of images. */
            public void Stop()
            {
                if (m_open && m_grabThread.IsAlive) /* Only start when open and grabbing. */
                {
                    m_grabThreadRun = false; /* Causes the grab thread to stop. */
                    m_grabThread.Join(); /* Wait for it to stop. */
                }
            }
    Sebbur

Discussions similaires

  1. Zoom et Scroll sur une PictureBox avec BackgroundImage
    Par Khoral dans le forum Windows Forms
    Réponses: 5
    Dernier message: 15/10/2009, 15h18
  2. Rendre le fond transparent dans une picturebox
    Par fun31 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 20/01/2005, 18h17
  3. [C#] Problème avec une PictureBox
    Par david71 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 07/01/2005, 16h59
  4. VB6] imprimer le texte afficher dans une picturebox
    Par Persons dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 27/08/2004, 11h15
  5. Effet Fade In / Fade Out sur une surface DirectDraw
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 08/09/2002, 17h37

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