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:
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <le rapport> = <PictureBox>.<Image>.<Dimension Max> / <PitcureBox>.<Dimension correspondante> ;
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):
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.
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();
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
Partager