[C#]Offset souris / image dans pictureBox

Résolu
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 - 6 mars 2006 à 09:33
cs_wafa59 Messages postés 6 Date d'inscription samedi 24 octobre 2009 Statut Membre Dernière intervention 6 février 2010 - 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
A voir également:

8 réponses

dgouttegattat Messages postés 129 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 30 décembre 2007 3
7 mars 2006 à 13:26
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.
3
dgouttegattat Messages postés 129 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 30 décembre 2007 3
6 mars 2006 à 11:02
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.
0
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 2
6 mars 2006 à 11:23
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
0
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 2
9 mars 2006 à 19:04
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
projetf Messages postés 26 Date d'inscription dimanche 15 avril 2007 Statut Membre Dernière intervention 27 avril 2009
3 mai 2007 à 14:15
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
0
merieait Messages postés 1 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 18 décembre 2009
18 déc. 2009 à 11:44
Pour changer la taille d'un pictureBox rien de plus simple avec les propriété .width and .height
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
18 déc. 2009 à 13:24
@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é ! -
0
cs_wafa59 Messages postés 6 Date d'inscription samedi 24 octobre 2009 Statut Membre Dernière intervention 6 février 2010
19 déc. 2009 à 08:44
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!!!
0
Rejoignez-nous