W jaki sposób należy przetłumaczyć od ekranu miejsca współrzędne do obrazu współrzędne miejsca w PictureBox WinForm?

głosy
13

Mam aplikacji, która wyświetla obraz wewnątrz Windows Forms PictureBoxkontroli. SizeModeKontroli jest ustawiony Zoomtak, że obraz zawarty w PictureBoxbędą wyświetlane w sposób prawidłowy aspektowo niezależnie od wymiarów PictureBox.

To jest dobre dla wizualnego wyglądu aplikacji, ponieważ można rozmiar okna jednak chcesz, a obraz będzie zawsze wyświetlane przy użyciu swojego najlepszego dopasowania. Niestety, również muszą obsługiwać zdarzenia kliknięcia myszą na pole obrazu i muszą być w stanie przetłumaczyć od ekranu miejsca współrzędne do obrazu współrzędne miejsca.

Wygląda na to, że łatwo przełożyć z miejsca na ekranie, aby kontrolować miejsca, ale nie widzę żadnych oczywistych sposób tłumaczyć z przestrzeni kontrolnej do przestrzeni obrazu (czyli współrzędnych pikselowych obrazu źródłowego, który został zmniejszony w polu zdjęciu).

Czy istnieje prosty sposób to zrobić, czy mam po prostu powielić matematyki skalowania, że ​​są one za pomocą wewnętrznie, aby umieścić obraz i wykonać tłumaczenie sobie?

Utwórz 05/08/2008 o 21:28
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
1

W zależności od skalowania, względny obraz piksel może być wszędzie w liczbie pikseli. Na przykład, jeżeli obraz jest skalowany w dół znacznie, piksel 2, 10 może reprezentować 2, 10 aż do 20, 100), więc będziesz musiał zrobić matematyka samodzielnie i ponosi pełną odpowiedzialność za ewentualne nieścisłości! :-)

Odpowiedział 05/08/2008 o 21:33
źródło użytkownik

głosy
6

I skończyłem właśnie wdrożenie tłumaczenie ręcznie. Kod nie jest tak źle, ale nie zostawiaj mnie chce, że pod warunkiem, że poparcie dla niego bezpośrednio. Widziałam taka metoda jest przydatna w wielu różnych okolicznościach.

Chyba dlatego dodali metody rozszerzenie :)

W Pseudokod:

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

Aby uzyskać pozycję piksela w obrazie, można po prostu pomnożyć przez rzeczywistych wymiarów obrazu w pikselach, ale znormalizowane współrzędne pozwalają rozwiązać oryginalnego punktu odpowiadającego o rozwiązywaniu niejasności na zasadzie case-by-case.

Odpowiedział 06/08/2008 o 05:25
źródło użytkownik

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