Сведения о вопросе

Codeliver

16:03, 1st July, 2020

Теги

c#   winforms   picturebox    

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

Просмотров: 586   Ответов: 2

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

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

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

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



  Сведения об ответе

DO__IT

18:03, 1st July, 2020

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

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

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

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

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


  Сведения об ответе

#hash

18:03, 1st July, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться