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

голоса
13

У меня есть приложение , которое отображает изображение внутри форм Windows , PictureBoxуправления. SizeModeКонтроля установлен в положение, Zoomтак что изображение содержится в PictureBoxбудет отображаться в одном аспекте-правильный путь независимо от размеров PictureBox.

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

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

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

Задан 05/08/2008 в 21:28
источник пользователем
На других языках...                            


2 ответов

голоса
6

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

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

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

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

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

Ответил 06/08/2008 в 05:25
источник пользователем

голоса
1

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

Ответил 05/08/2008 в 21:33
источник пользователем

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