Как мне перевести координаты экранного пространства в координаты пространства изображения в WinForms PictureBox?

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

  •  08-06-2019
  •  | 
  •  

Вопрос

У меня есть приложение, которое отображает изображение внутри Windows Forms. PictureBox контроль.А SizeMode элемента управления установлен на Zoom так что изображение, содержащееся в PictureBox будет отображаться с правильным соотношением сторон независимо от размеров изображения. PictureBox.

Это отлично подходит для визуального оформления приложения, поскольку вы можете изменить размер окна по своему усмотрению, и изображение всегда будет отображаться с оптимальным размером.К сожалению, мне также нужно обрабатывать события щелчка мыши в поле изображения и иметь возможность преобразовывать координаты экранного пространства в координаты пространства изображения.

Похоже, что перевести из пространства экрана в пространство управления легко, но я не вижу очевидного способа перевода из пространства управления в пространство изображения (т.координата пикселя исходного изображения, масштабированного в графическом поле).

Есть ли простой способ сделать это, или мне следует просто продублировать математические вычисления масштабирования, которые они используют внутри себя для позиционирования изображения, и выполнить перевод самостоятельно?

Это было полезно?

Решение

В зависимости от масштабирования относительный пиксель изображения может находиться в любом количестве пикселей.Например, если изображение значительно уменьшено, пиксель 2, 10 может представлять собой 2, 10 вплоть до 20, 100), поэтому вам придется выполнить математические расчеты самостоятельно и взять на себя полную ответственность за любые неточности!:-)

Другие советы

В итоге я просто реализовал перевод вручную.Код не так уж плох, но мне хотелось, чтобы они оказывали ему поддержку напрямую.Я видел, что такой метод может быть полезен во многих различных обстоятельствах.

Думаю, именно поэтому они добавили методы расширения :)

В псевдокоде:

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

Чтобы получить положение пикселя на изображении, вам нужно просто умножить его на фактические размеры пикселей изображения, но нормализованные координаты позволяют вам обратиться к точке зрения исходного респондента о разрешении неоднозначности в каждом конкретном случае.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top