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

voix
13

J'ai une application qui affiche une image à l' intérieur d'un Windows Forms PictureBoxcontrôle. Le SizeModedu contrôle est réglé de Zoomtelle sorte que l'image contenue dans le PictureBoxsera affiché d'une manière d'aspect correct quelles que soient les dimensions du PictureBox.

C'est idéal pour l'aspect visuel de l'application parce que vous pouvez modifier la taille mais la fenêtre que vous voulez et l'image sera toujours affichée à l'aide de son meilleur ajustement. Malheureusement, je dois aussi gérer les événements de clic de la souris sur la zone d'image et doivent être en mesure de traduire à partir de l'espace écran vers les coordonnées d'espace d'image.

On dirait qu'il est facile de traduire à partir de l'espace de l'écran pour contrôler l'espace, mais je ne vois pas de façon évidente de traduire de l'espace de commande à l'espace d'image (le pixel de coordonnées dans l'image source qui a été réduite dans la zone d'image).

Y at-il un moyen facile de faire cela, ou devrais-je dupliquer le calcul d'échelle qu'ils utilisent en interne pour positionner l'image et faire la traduction moi-même?

Créé 05/08/2008 à 21:28
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
6

Je me suis retrouvé juste la mise en œuvre de la traduction manuellement. Le code est pas trop mal, mais il ne me laisse pas souhaiter que leur ont apporté leur soutien directement. Je pouvais voir une telle méthode est utile dans beaucoup de circonstances différentes.

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

En pseudocode:

// 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 de pixel dans l'image, vous souhaitez multiplier par les juste dimensions de pixel d'image réelle, mais les coordonnées normalisées vous permettent d'aborder le point de répondeur d'origine sur la résolution d'ambiguïté au cas par cas.

Créé 06/08/2008 à 05:25
source utilisateur

voix
1

En fonction de l'échelle, le pixel d'image par rapport 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 tout le chemin jusqu'à 20, 100), de sorte que vous aurez à faire le calcul vous-même et assumer l'entière responsabilité pour toute inexactitude! :-)

Créé 05/08/2008 à 21:33
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more