2008-08-05 23 views
13

Tengo una aplicación que muestra una imagen dentro de un control de Windows Forms PictureBox. El SizeMode del control está configurado en Zoom para que la imagen contenida en PictureBox se muestre de forma correcta independientemente de las dimensiones del PictureBox.¿Cómo debo traducir las coordenadas del espacio de la pantalla a las coordenadas del espacio de la imagen en un PictureBox de WinForms?

Esto es ideal para la apariencia visual de la aplicación porque puede ajustar el tamaño de la ventana como desee y la imagen siempre se mostrará con su mejor ajuste. Desafortunadamente, también necesito manejar los eventos de clic del mouse en el cuadro de imagen y necesito poder traducir las coordenadas del espacio de la pantalla a las coordenadas del espacio de la imagen.

Parece que es fácil traducir del espacio de la pantalla al espacio de control, pero no veo ninguna forma obvia de trasladar del espacio de control al espacio de la imagen (es decir, la coordenada de píxel en la imagen fuente escalada en el cuadro de imagen).

¿Hay una manera fácil de hacer esto, o debería simplemente duplicar las matemáticas de escala que están utilizando internamente para colocar la imagen y hacer la traducción yo mismo?

Respuesta

1

Dependiendo de la escala, el píxel de la imagen relativa podría estar en cualquier lugar en una cantidad de píxeles. Por ejemplo, si la imagen se reduce significativamente, el píxel 2, 10 podría representar 2, 10 hasta llegar a 20, 100), por lo que tendrá que hacer los cálculos usted mismo y asumir toda la responsabilidad de las imprecisiones. :-)

6

Terminé simplemente implementando la traducción manualmente. El código no está tan mal, pero me dejó deseando que brindaran soporte directamente. Pude ver tal método siendo útil en muchas circunstancias diferentes.

supongo que por eso, agregaron los métodos de extensión :)

En pseudocódigo:

// 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) 

para obtener la posición del pixel en la imagen, que acababa de multiplicar por las dimensiones reales de pixel de imagen, pero las coordenadas normalizadas le permiten abordar el punto del respondedor original sobre la resolución de la ambigüedad caso por caso.

+1

Hola, sería genial ver una muestra del código que juntas si todavía tienes a mano. –

+1

Claro, lo edité en mi respuesta – fastcall

Cuestiones relacionadas