¿Cómo debo traducir las coordenadas del espacio de la pantalla a las coordenadas del espacio de la imagen en un PictureBox de WinForms?

votos
13

Tengo una aplicación que muestra una imagen dentro de un PictureBoxcontrol de Windows Forms . La SizeModeconfiguración del control está configurada para Zoomque la imagen contenida en la imagen PictureBoxse muestre de forma correcta independientemente de las dimensiones de la PictureBox.

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 desde el 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 que se ha escalado en el cuadro de imagen).

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

Publicado el 05/08/2008 a las 21:28
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
6

Terminé 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 es por eso que agregaron 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 de píxel en la imagen, simplemente multiplique por las dimensiones del píxel de la imagen real, pero las coordenadas normalizadas le permiten abordar el punto del respondedor original sobre la resolución de la ambigüedad caso por caso.

Respondida el 06/08/2008 a las 05:25
fuente por usuario

votos
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. :-)

Respondida el 05/08/2008 a las 21:33
fuente por usuario

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