propiedades imagen cargar c# winforms picturebox

propiedades - picturebox c# cargar imagen



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

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

Tengo una aplicación que muestra una imagen dentro de un control de Windows Forms PictureBox . El SizeMode de SizeMode del control se establece en Zoom para que la imagen contenida en el PictureBox se muestre de forma correcta, independientemente de las dimensiones del 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?


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.