[C#]Offset souris / image dans pictureBox [Résolu]

cs_fcolo 201 Messages postés mercredi 8 février 2006Date d'inscription 20 février 2007 Dernière intervention - 6 mars 2006 à 09:33 - Dernière réponse : cs_wafa59 6 Messages postés samedi 24 octobre 2009Date d'inscription 6 février 2010 Dernière intervention
- 19 déc. 2009 à 08:44
Bonjour,

Je souhaiterai connaitre la position X/Y du pointeur de la souris par rapport à l'image contenu dans une pictureBox.
En fait la position relative à l'image de la souris.
L'image dans la pictureBox est centrée mais peut etre plus petite ou plus grande.
Avec le PointToScreen ou PointToClient j'ai la position par rapport à l'écran ou du pictureBox mais pas de l'image contenue dans la pictureBox.

Savez vous comment faire?

f.colo
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
dgouttegattat 129 Messages postés mardi 22 novembre 2005Date d'inscription 30 décembre 2007 Dernière intervention - 7 mars 2006 à 13:26
3
Merci
La méthode suivante doit pouvoir fonctionner quelle que soit la valeur de la propriété SizeMode; elle prend en paramètre le contrôle PictureBox et un Point représentant les coordonnées relatives au coin supérieur droit du PB.

Point OffsetToImage(PictureBox pbox, Point p)
{
// Calculer les taux d'étirement/compression de l'image
float xRatio = 1F;
float yRatio = 1F;
if (pbox.SizeMode == PictureBoxSizeMode.StretchImage)
{
xRatio = pbox.Width / pbox.Image.Width;
yRatio = pbox.Height / pbox.Image.Height;
}
else if (pbox.SizeMode == PictureBoxSizeMode.Zoom)
{ xRatio yRatio pbox.Width > pbox.Height ?
pbox.Height / pbox.Image.Height
: pbox.Width / pbox.Image.Width;
}

// Calculer la taille de l'image affichée
Size imgSize = new Size((int)(pbox.Image.Width * xRatio),
(int)(pbox.Image.Height * yRatio));

// Déterminer la position du coin supérieur droit de l'image
// par rapport au coin supérieur droit du picture box.
// En mode Normal ou AutoSize, c'est (0,0).
Point imgPosition = new Point();
if (pbox.SizeMode == PictureBoxSizeMode.CenterImage
|| pbox.SizeMode == PictureBoxSizeMode.StretchImage
|| pbox.SizeMode == PictureBoxSizeMode.Zoom)
{
// Dans ces trois modes, l'image est centrée dans le PB.
imgPosition.X = pbox.Width / 2 - imgSize.Width / 2;
imgPosition.Y = pbox.Height / 2 - imgSize.Height / 2;
}

// Transformer les coordonnées fournies pour les rendre
// relatives au coin supérieur droit de l'image
Point result = new Point(p.X - imgPosition.X, p.Y - imgPosition.Y);

// Appliquer les taux d'étirement/compression
result.X = (int)(result.X / xRatio);
result.Y = (int)(result.Y / yRatio):

// Enfin, comme en mode Normal, Center et Stretch l'image n'occupe
// pas forcément la totalité de la zone cliente du picture box, il faut
// vérifier que le point n'est pas en dehors de l'image. S'il est, on le
// "ramène" de force vers le bord de l'image le plus proche.
if (result.X < 0)
result.X = 0;
else if (result.X >= pbox.Image.Width)
result.X = pbox.Image.Width - 1;
if (result.Y < 0)
result.Y = 0;
else if (result.Y >= pbox.Image.Height)
result.Y = pbox.Image.Height - 1;

return result;
}

Bien sûr, si tu ne prévois de pouvoir changer dynamiquement le mode d'affichage, tu peux supprimer les tests sur la propriété SizeMode.
Normalement, ça marche. Tiens-moi au courant si ce n'est pas le cas.

Merci dgouttegattat 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de dgouttegattat
dgouttegattat 129 Messages postés mardi 22 novembre 2005Date d'inscription 30 décembre 2007 Dernière intervention - 6 mars 2006 à 11:02
0
Merci
Bonjour fcolo,
S'il existe une méthode toute prête permettant d'obtenir la position par rapport à l'image, je ne la connais pas :(.
Si l'image est centrée dans le PictureBox (propriété SizeMode réglée à PictureBoxSizeMode.CenterImage), connaissant les dimensions du contrôle PictureBox et de l'image, tu peux t'en sortir en calculant la position du coin supérieur droit de l'image par rapport au coin supérieur droit du PictureBox.
Par exemple:
int ulx = (pictureBox.Size.Width / 2) - (pictureBox.Image.Size.Width / 2);
int uly = (pictureBox.Size.Height / 2) - (pictureBox.Image.Size.Height / 2);
// ulx et uly sont les coordonnées du coin supérieur droit de l'image par rapport
// au coin supérieur droit du PictureBox.
int x = mX - ulx;
int y = mY - ulx;
// mX et mY sont les coordonnées du pointeur de la souris par rapport au coin
// supérieur droit du PictureBox, et x et y les coordonnées du pointeur par
// rapport au coin supérieur droit de l'image.
Attention, ce n'est pas valable si l'image n'est pas centrée dans le contrôle.
J'espère que c'est bien ce que tu voulais savoir.
Commenter la réponse de dgouttegattat
cs_fcolo 201 Messages postés mercredi 8 février 2006Date d'inscription 20 février 2007 Dernière intervention - 6 mars 2006 à 11:23
0
Merci
En fait oui, ca répond à ce que je voulais savoir mais dans mon cas, malgrès ce que j'ai indiqué, l'image est en zoom donc votre solution n'est pas valable dans ce cas.
Je me suis trituré l'esprit dans tous les sens mais je n'y suis pas arrivé.
Comme l'image est en zoom, je n'arrive pas a récupérer la taille visible et non la taille réelle ( pictureBox1.Image.Height/Width; et pictureBox1.Image.PhysicalDimension; me donne les même dimention).

En fait, je récupère l'image retournée d'une caméra IP.
Lors du clic, je veux demander l'image centrée par rapport à la position du clic.
Ma caméra me permet de faire celà en demandant l'image centré autour d'un point donnée ou de l'offset par rapport au point central précédent.
(je ne sais pas si j'ai été clair sur ce coup ...)

C'est pour celà que je doit connaitre les coordonnées du clic dans l'image courante pour ensuite pouvoir demander l'affichage de l'image suivante.

Si je met les propriété de l'image en Strech, ca fonctionne mais c'est pas joli, on ne conserve pas le format de l'image.

f.colo
Commenter la réponse de cs_fcolo
cs_fcolo 201 Messages postés mercredi 8 février 2006Date d'inscription 20 février 2007 Dernière intervention - 9 mars 2006 à 19:04
0
Merci
Sur les tests que j'ai fait (test non poussé quadn meme) ca à fonctionné.
J'ai changé de technique d'affichage et le pictureBox prends tout le tour de l'image donc je n'ai plus de problème maintenant, je fais référence à coin supérieur gauche du pictureBox plutot que de l'image.

Merci

f.colo
Commenter la réponse de cs_fcolo
projetf 26 Messages postés dimanche 15 avril 2007Date d'inscription 27 avril 2009 Dernière intervention - 3 mai 2007 à 14:15
0
Merci
slt jai limpression ke vs vs y connaissai en picturebox je voudrai savoir ct on fait pr pouvoir modifier la taille d'un picturebox ,et de l'image quiest dedans biens sur en runtime.

Itshak
Commenter la réponse de projetf
merieait 1 Messages postés samedi 31 janvier 2009Date d'inscription 18 décembre 2009 Dernière intervention - 18 déc. 2009 à 11:44
0
Merci
Pour changer la taille d'un pictureBox rien de plus simple avec les propriété .width and .height
Commenter la réponse de merieait
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 18 déc. 2009 à 13:24
0
Merci
@Merieait : ce message date de 2007 ^^ De plus, les propriétés sont Width et Height, avec une majuscule ;)

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
Commenter la réponse de krimog
cs_wafa59 6 Messages postés samedi 24 octobre 2009Date d'inscription 6 février 2010 Dernière intervention - 19 déc. 2009 à 08:44
0
Merci
slt, j'aimerai bien que vous m'aidez à trouver un code pour que dés que je clique sur une picture box je puisse récuperer les coordonnées de ce pixel.
ùerci d'avance!!!
Commenter la réponse de cs_wafa59

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.