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

godefrw 56 Messages postés lundi 13 septembre 2004Date d'inscription 20 mars 2006 Dernière intervention - 5 oct. 2004 à 16:48 - Dernière réponse : godefrw 56 Messages postés lundi 13 septembre 2004Date d'inscription 20 mars 2006 Dernière intervention
- 12 oct. 2004 à 10:20
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
Afficher la suite 

8 réponses

Répondre au sujet
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 11 oct. 2004 à 18:15
+3
Utile
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#
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_coq
gg00xiv 656 Messages postés mercredi 22 août 2001Date d'inscription 11 mars 2005 Dernière intervention - 5 oct. 2004 à 19:10
0
Utile
Regarde du côté de la propriété SizeMode de ta PictureBox.

Membre du Labo .NET
gg00xiv's Blog
Commenter la réponse de gg00xiv
godefrw 56 Messages postés lundi 13 septembre 2004Date d'inscription 20 mars 2006 Dernière intervention - 6 oct. 2004 à 11:04
0
Utile
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
Commenter la réponse de godefrw
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 6 oct. 2004 à 18:28
0
Utile
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 !!!!
Commenter la réponse de cs_coq
godefrw 56 Messages postés lundi 13 septembre 2004Date d'inscription 20 mars 2006 Dernière intervention - 11 oct. 2004 à 11:22
0
Utile
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
Commenter la réponse de godefrw
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 11 oct. 2004 à 11:54
0
Utile
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#
Commenter la réponse de cs_coq
godefrw 56 Messages postés lundi 13 septembre 2004Date d'inscription 20 mars 2006 Dernière intervention - 11 oct. 2004 à 14:26
0
Utile
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
Commenter la réponse de godefrw
godefrw 56 Messages postés lundi 13 septembre 2004Date d'inscription 20 mars 2006 Dernière intervention - 12 oct. 2004 à 10:20
0
Utile
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
Commenter la réponse de godefrw

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.