Dessiner un graphics sur une image contenue dans une pictureBox [Résolu]

Signaler
Messages postés
56
Date d'inscription
lundi 13 septembre 2004
Statut
Membre
Dernière intervention
20 mars 2006
-
Messages postés
56
Date d'inscription
lundi 13 septembre 2004
Statut
Membre
Dernière intervention
20 mars 2006
-
Bonjour, je cherche à afficher un objet Graphics (sur lequel j'ai dessiner des formes rectangles, rond etc) par dessus une image. Mon image est contenu dans un picutureBox.

Je procède de la manière suivante:
_créatioon du pictureBox.

_creation d'un bitmap à partir d'une image
Bitmap objet = new Bitmap(thisform.Image);

_creation du graphics à partir de mon bitmap
g = Graphics.FromImage(objet);

_dessin sur le graphique

_ajout de mon bitmap comme image de la pictureBox

J'ai un problème car les formes ne semblent pas être dessinées à l'échelle de la pictureBox et avec les coordonnées calculer par rapport à la picturebox.
Si quelqu'un pouvait me filer un tuyaux...

Ced

8 réponses

Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
82
ah

bon un petit exemple vaut mieux qu'un long discours, je crois que ça correspond à ce que tu veux faire :
private Point m_debut_rect;

private void pictureBox_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
m_debut_rect = new Point(e.X, e.Y);
}

private void pictureBox_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
Bitmap bmp = new Bitmap(pictureBox.Image, pictureBox.Size);
Graphics g = Graphics.FromImage(bmp);
Rectangle rectangle = Rectangle.FromLTRB(m_debut_rect.X, m_debut_rect.Y, e.X, e.Y);
g.DrawRectangle(Pens.Black, rectangle);
pictureBox.Image = bmp;
}


bon ce code ne dessinera le rectangle que si l'utilisateur "dessine" dans le sens "selection point haut-gauche" puis "selection point bas-droit" mais je te laisse regler ce léger détail :)

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
656
Date d'inscription
mercredi 22 août 2001
Statut
Membre
Dernière intervention
11 mars 2005
13
Regarde du côté de la propriété SizeMode de ta PictureBox.

Membre du Labo .NET
gg00xiv's Blog
Messages postés
56
Date d'inscription
lundi 13 septembre 2004
Statut
Membre
Dernière intervention
20 mars 2006

Tuc as raison le problème vient de là. J'avais mis à size mode la valeur stretchImage. J'aimerais bien pouvoir malgré tout garder cette proprité car je peux manipuler des images de taille différente et je veux que mon application affiche l'image en eentier quelque soit la taille de la fenêtre. Sinon ça fonctionne convenablement au niveau du dessin avec les valeurs normal et autosize.
Ced
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
82
dans ce cas là il va falloir que tu calcules tes coordonnées de dessin suivant les dimensions du picturebox

sinon une autre solution :
tu crée un Bitmap avec les mêmes dimensions que ton image
tu crée un Graphics dessus
tu dessines l'image sur le Bitmap
tu fais tes autres dessins (donc avec la taille réelle de l'image)
puis tu affectes le Bitmap au PictureBox
ainsi tes dessins "profiteront" aussi de l'agrandissement ou de la reduction

Cocoricoooooooo !!!!
Messages postés
56
Date d'inscription
lundi 13 septembre 2004
Statut
Membre
Dernière intervention
20 mars 2006

Peux-tu me donner quelques précisions?
J'essaye de faire la deuxième méthode que tu m'as donnée mais je bloque sur le dessin de l'image sur le bitmap:
voilà mon code
Bitmap objet = new Bitmap(MyImage.Width, MyImage.Height);
g = Graphics.FromImage(objet);

J'essaye ensuite d'utiliser la fonction drawImage sur le Graphics mais il existe 30 surcharges de cette fonction; il semble à chaque qu'il faille préciser la taille ou le point supérieur gauche. J'en est essayé quelques (dont g.drawImage(MyImage, ma_pictureBox.loction.x, ma_pictureBox.location0.y) )qui ne m'ont pas donné de résultats intéressants. A quoi pensais-tu?

Ced
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
82
DrwImageUnscaled me parait plus appropriée dans ton cas en fait
sinon le graphics est defini sur le bitmap et non le form, donc les coordonnées 0,0 me semblent plus correctes :)

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
56
Date d'inscription
lundi 13 septembre 2004
Statut
Membre
Dernière intervention
20 mars 2006

Ca ne marche pas...J'ai utilsé ce code:
g.DrawImageUnscaled(MyImage,0,0,thisform.Width,thisform.Height);
Je pense que la solution de calculer les coordonnées de dessin en fonction de la taille de la pictureBox est meilleure. Par contre je ne sais absoluement pas le faire.
En fait dans mon application c'est l'utilisateur qui déssine. Il dessine un rectangle qu'il étire en déplaçant la souris. Je recupère les coordonnées de ce rectangle dans la pictureBox grasse à la position du cursor de la souris. Je trace ensuite le rectangle. En théorie les coordonnées de dessin sont déjà calculer en fonction de la taille de la pictureBox non?
si tu as une idée lumineuse...
Ced
Messages postés
56
Date d'inscription
lundi 13 septembre 2004
Statut
Membre
Dernière intervention
20 mars 2006

Merci!
C'est exactement ce que je voulais faire! Mon code était très proche sauf que je n'utilisais pas le bon constructeur de bitmap....

Ced