Comment dois-je traduire à partir de l'écran de coordonnées de l'espace à l'image de coordonnées de l'espace dans un WinForms PictureBox?

StackOverflow https://stackoverflow.com/questions/2804

  •  08-06-2019
  •  | 
  •  

Question

J'ai une application qui affiche une image à l'intérieur d'un Windows Forms PictureBox de contrôle.L' SizeMode le contrôle est définie à Zoom de sorte que l'image contenue dans le PictureBox sera affiché dans un aspect correct manière, quel que soit les dimensions de la PictureBox.

Ce qui est excellent pour l'aspect visuel de l'application, car vous pouvez la taille de la fenêtre comme vous le souhaitez et l'image s'affiche toujours à l'aide de son meilleur ajustement.Malheureusement, j'ai aussi besoin de manipuler la souris cliquez sur les événements sur la zone de l'image et doivent être en mesure de traduire à partir de l'écran-coordonnées de l'espace à l'image de coordonnées de l'espace.

On dirait qu'il est facile de traduire de l'espace à l'écran pour contrôler l'espace, mais je ne vois pas de moyen évident de traduire de l'espace de commande, à l'image de l'espace (c'est à direle pixel de coordonnées dans l'image d'origine qui a été mis à l'échelle dans la zone d'image).

Est-il un moyen facile de faire cela, ou dois-je simplement en double la mise à l'échelle des mathématiques qu'ils utilisent en interne pour la position de l'image et de faire la traduction moi-même?

Était-ce utile?

La solution

En fonction de la mise à l'échelle, le rapport de pixel de l'image pourrait être n'importe où dans un certain nombre de pixels.Par exemple, si l'image est réduite de manière significative, pixel 2, 10 pourrait représenter 2, 10, jusqu'à 20, 100), de sorte que vous aurez à faire le calcul vous-même et prendre la pleine responsabilité pour toute imprécision, inexactitude!:-)

Autres conseils

Je me suis retrouvé juste à la mise en œuvre de la traduction manuellement.Le code n'est pas trop mauvais, mais il ne me laisse souhaitant qu'ils ont fourni un soutien pour elle directement.J'ai pu voir une telle méthode utile dans beaucoup de situations différentes.

Je suppose que c'est pourquoi ils ont ajouté des méthodes d'extension :)

En pseudo-code:

// Recompute the image scaling the zoom mode uses to fit the image on screen
imageScale ::= min(pictureBox.width / image.width, pictureBox.height / image.height)

scaledWidth  ::= image.width * imageScale
scaledHeight ::= image.height * imageScale

// Compute the offset of the image to center it in the picture box
imageX ::= (pictureBox.width - scaledWidth) / 2
imageY ::= (pictureBox.height - scaledHeight) / 2

// Test the coordinate in the picture box against the image bounds
if pos.x < imageX or imageX + scaledWidth < pos.x then return null
if pos.y < imageY or imageY + scaledHeight < pos.y then return null

// Compute the normalized (0..1) coordinates in image space
u ::= (pos.x - imageX) / imageScale
v ::= (pos.y - imageY) / imageScale
return (u, v)

Pour obtenir la position du pixel dans l'image, vous devriez juste multiplier par le pixel de l'image dimensions, mais les coordonnées normalisées permettant de s'adresser l'original du répondeur point sur la résolution de l'ambiguïté au cas par cas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top