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 :

[DEBUTANT] Prolèmes avec le dessin sur image


Sujet :

C#

  1. #1
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut [DEBUTANT] Prolèmes avec le dessin sur image
    Bonsoir à tous.

    Tout d'abord, je ne sais pas si le post est à sa place ici. Si ce n'est pas le cas, veuillez m'en excuser .

    Voilà je vais vous exposer mon problème.

    Je dois réaliser un programme qui permette de dessiner sur une image des formes simples (pour comencer). Pour ce faire, j'utilise une pictureBox dans laquelle je place mon image ( name = _pbImage ). La taille de cette pictureBox est de 635; 401. J'ai placer la propriétés SizeMode en Zoom, pour que l'image que je vais placer dans la pictureBox soit automatiquement adaptée à la taille de cette dernière.

    Donc je peux ouvrir une image ayant une résolution de 1280;800 dans cette pictureBox sans pour autant déformé l'image. J'ai lu que lors de l'utilisation de l'option de SizeMode, le programme regarde quelle est la dimension de l'image (width ou height) la plus élevée. En fonction de celle-ci, il va calculer un rapport de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <le rapport> = <PictureBox>.<Image>.<Dimension Max> / <PitcureBox>.<Dimension correspondante> ;
    Ensuite il va appliquer ce rapport au dimension de l'image pour que celle-ci puisse être affichée sans déformation dans la PictureBox, tout en centrant la dimension ( de l'image qui est la plus petite ), avec l'axe correspondant dans la pictureBox.

    Maintenant, mon problème, lorsque je dessine une forme à l'aide de l'objet graphics dans ma PictureBox, celle-ci (la forme), n'est pas affichée au bon endroit.

    Pour ce faire j'utilise le code suivant dans la fonction _pbImage_MouseUp(object sender, MouseEventArgs e):

    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
     
    // Je récupère la position de la souris lorsque je relâche le bouton de la souris
                    Pos2X = e.X;
                    Pos2Y = e.Y;
    // quelque variables pour mes calculs
                    float rapport, val1;
                    float largeur, hauteur, hauteurImg, largeurImg;
    // Les positions pour dessiner sur l'image
                    float PosImg1X=0, PosImg1Y=0, PosImg2X=0, PosImg2Y=0;
     
    // coordonées sur l'image
    // en fonction le dimension la plus grande, je calcul mon rapport pour pouvoir me placer dans l'image pour dessiner la forme
                    rapport = _pbImage.Image.Width > _pbImage.Image.Height ? _pbImage.Image.Width / _pbImage.Width : _pbImage.Image.Height / _pbImage.Height;
     
                    // si _pbImage.Image.Width > _pbImage.Image.Height alors centrée en Height et inversemment
                    // il faut vérifier sur quelle axe l'image est centrée
                    // il faut ajouter la différence entre le bord de la pictureBox et l'image
     
                    if (_pbImage.Image.Width > _pbImage.Image.Height)
                    {
                        val1 = (_pbImage.Image.Height / rapport) / 2;
                        PosImg1X = (float)Pos1X * rapport;
                        PosImg1Y = (float)Pos1Y * rapport;
                        PosImg1Y += val1;
                        PosImg2X = (float)Pos2X * rapport;
                        PosImg2Y = (float)Pos2Y * rapport;
                        PosImg2Y += val1;
                    }
                    else
                    {
                        val1 = (_pbImage.Image.Width / rapport) / 2;
                        PosImg1X = (float)Pos1X * rapport;
                        PosImg1X += val1;
                        PosImg1Y = (float)Pos1Y * rapport;
                        PosImg2X = (float)Pos2X * rapport;
                        PosImg2X += val1;
                        PosImg2Y = (float)Pos2Y * rapport;
                    }
    // Je crée mes objets graphics pour l'image proprement dites et pour la pictureBox
    // Je dois créer séparément pour l'image parce que sinon les changements ne seront pas pris en compte lors d'une sauvegarde
                    Cursor.Current = Cursors.Default;
                    Graphics gImg = Graphics.FromImage(_pbImage.Image);
                    Graphics g = _pbImage.CreateGraphics();
    Voilà, maintenant le problème suivant se passe. Lorsque je dessine ma forme sur la PictureBox, il ne la redessine pas au même endroit sur l'image, les formes sont décalées. Voici un printscreen de ce que j'obtiens; je tiens à préciser que la forme de la pictureBox a été rajoutée via paint.



    Je tiens a préciser que pour dessiner la forme sur l'image, j'utilise bien les valeurs de PosImgXX, et que pour dessiner sur la pictureBox, j'utilise les valeurs de PosXX, XX allant de 1X à 2Y.

    Voilà, alors, je pense (enfin je ne vois pas d'autre origine) qu'il y a une erreur llors de mon calcul des coordonnées de PosImg1X à PosImg2Y, mais je ne voit absolument pas d'où cette erreur peut provenir .

    J'espère que ceux d'entre vous qui ont déjà travailler sur des traitments basiques d'images (et les autres aussi) pourront m'aider à trouver mon erreur.
    J'espère également être rester clair dans mes explications et dans la présentation de mon problème.

    Je vous remrcie d'avance pour l'aide que vous pourrez m'apporter, et vous souhaites de joyeuse fêtes de Pâques (enfin le petit jour qu'il reste).

    Lorsque j'aurais fini cette "belle" application, j'essayerais de la rendre un peu plus lisible et vous promet de diffuser le code pour un tuto, si cela est permis du moins .

    Si jamais l'une ou l'autre question vous avez, à votre disposition je resterais .

    Merci pour la lecture, Richard_sraing

  2. #2
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    Voilà comme je l'avais promis, je post ici bas la solution.

    En fait l'erreur venait du fait que je faisait erreur dans le calcul de la valeur à ajouter du côté ou l'image était centrée.

    Voici donc ce que j'obtiens:

    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
            private void _pbImage_MouseUp(object sender, MouseEventArgs e)
            {
                if (_pbImage.Capture == true)
                {
                    Pos2X = e.X;
                    Pos2Y = e.Y;
     
                    float rapport, val1;
                    float largeur, hauteur, hauteurImg, largeurImg;
                    float PosImg1X=0, PosImg1Y=0, PosImg2X=0, PosImg2Y=0;
                    // coordonées sur l'image
                    rapport = _pbImage.Image.Width > _pbImage.Image.Height ? _pbImage.Image.Width / _pbImage.Width : _pbImage.Image.Height / _pbImage.Height;
     
                    // si _pbImage.Image.Width > _pbImage.Image.Height alors centrée en Height
                    // il faut vérifier sur quelle axe l'image est centrée
                    // il faut ajouter la différence entre le bord de la pictureBox et l'image
     
                    if (_pbImage.Image.Width > _pbImage.Image.Height)
                    {
    // l'erreur ce situait à ce niveau ci
                        val1 = _pbImage.Height - (_pbImage.Image.Height / rapport);
                        PosImg1X = (float)Pos1X * rapport;
                        PosImg1Y = (float)Pos1Y * rapport;
                        PosImg1Y += val1;
                        PosImg2X = (float)Pos2X * rapport;
                        PosImg2Y = (float)Pos2Y * rapport;
                        PosImg2Y += val1;
                    }
                    else
                    {
    // et ici
                        val1 = _pbImage.Width - (_pbImage.Image.Width / rapport);
                        PosImg1X = (float)Pos1X * rapport;
                        PosImg1X += val1;
                        PosImg1Y = (float)Pos1Y * rapport;
                        PosImg2X = (float)Pos2X * rapport;
                        PosImg2X += val1;
                        PosImg2Y = (float)Pos2Y * rapport;
                    }
     
                    Cursor.Current = Cursors.Default;
                    Graphics gImg = Graphics.FromImage(_pbImage.Image);
                    Graphics g = _pbImage.CreateGraphics();
    Voilà, donc si l'un d'entre vous rencontre le même problème que moi, vérifier vos calculs à l'aide d'une grande feuille de papier c'est utile.

    Sur ce, bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. impossible d'ouvrir popup avec un lien sur image
    Par tibotibo69 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/12/2009, 09h31
  2. Avec un click sur image, faire précédente
    Par Bydouille dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 20/10/2007, 13h20
  3. Dessiner sur image
    Par ViveLesQuads dans le forum Flash
    Réponses: 2
    Dernier message: 10/11/2006, 15h59
  4. Réponses: 5
    Dernier message: 23/09/2006, 12h40
  5. [Debutant] Un thread qui dessine sur une fenetre ???
    Par Spartan03 dans le forum OpenGL
    Réponses: 6
    Dernier message: 05/04/2006, 20h19

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