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

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

  •  08-06-2019
  •  | 
  •  

Pregunta

Tengo una aplicación que muestra una imagen dentro de Windows Forms. PictureBox control.El SizeMode del control está configurado en Zoom para que la imagen contenida en el PictureBox se mostrará con el aspecto correcto independientemente de las dimensiones del PictureBox.

Esto es excelente para la apariencia visual de la aplicación porque puede dimensionar 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 de 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 traducir del espacio de control al espacio de la imagen (es decir,la coordenada de píxeles en la imagen de origen 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 escala que usan internamente para posicionar la imagen y hacer la traducción yo mismo?

¿Fue útil?

Solución

Dependiendo de la escala, el píxel de la imagen relativa podría estar entre varios píxeles.Por ejemplo, si la imagen se reduce significativamente, los píxeles 2, 10 podrían representar 2, 10 hasta 20, 100), por lo que tendrás que hacer los cálculos tú mismo y asumir toda la responsabilidad por cualquier imprecisión.:-)

Otros consejos

Terminé implementando la traducción manualmente.El código no es tan malo, pero me hizo desear que me brindaran soporte directamente.Podría ver que un método de este tipo es útil en muchas circunstancias diferentes.

Supongo que por eso 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 los píxeles en la imagen, simplemente multiplicaría por las dimensiones reales de los píxeles de la imagen, pero las coordenadas normalizadas le permiten abordar el punto del respondedor original sobre cómo resolver la ambigüedad caso por caso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top