Как мне перевести координаты пространства экрана в координаты пространства изображения в WinForms PictureBox? - PullRequest
13 голосов
/ 06 августа 2008

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 06 августа 2008

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

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

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

// 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 голос
/ 06 августа 2008

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

...