2008-08-05 3 views
13

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

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

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

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

ответ

1

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

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) 

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

+1

Привет, было бы здорово увидеть образец кода, который вы собрали вместе, если у вас все еще есть это. – 2009-07-30 14:58:53