2008-08-05 17 views
13

Mam aplikację, która wyświetla obraz wewnątrz formantu Windows Forms PictureBox. Wartość SizeMode kontrolki jest ustawiona na Zoom, aby obraz zawarty w PictureBox był wyświetlany w prawidłowy sposób, bez względu na wymiary PictureBox.Jak powinienem przetłumaczyć współrzędne obszaru ekranu na współrzędne miejsca na obraz w WinForms PictureBox?

Jest to doskonałe rozwiązanie do wizualnego wyglądu aplikacji, ponieważ można dowolnie zmieniać rozmiar okna, a obraz będzie zawsze wyświetlany przy użyciu najlepszego dopasowania. Niestety, muszę również obsługiwać zdarzenia kliknięcia myszą w polu graficznym i potrzebować możliwości tłumaczenia ze współrzędnych przestrzeni ekranu na współrzędne przestrzeni obrazu.

Wygląda na to, że z przestrzeni ekranu można łatwo przetłumaczyć, aby kontrolować przestrzeń, ale nie widzę żadnego oczywistego sposobu na przekształcenie z przestrzeni kontrolnej na przestrzeń obrazu (np. Współrzędna piksela w obrazie źródłowym skalowanym w pudełko ze zdjęciami).

Czy istnieje prosty sposób, aby to zrobić, czy powinienem po prostu skopiować skalowanie matematyczne, którego używają wewnętrznie, aby ustawić obraz i samemu wykonać tłumaczenie?

Odpowiedz

1

W zależności od skalowania, względny piksel obrazu może znajdować się w dowolnym punkcie w wielu pikselach. Na przykład, jeśli obraz jest znacznie zmniejszony, piksel 2, 10 może reprezentować 2, 10 aż do 20, 100), więc będziesz musiał sam wykonać obliczenia i wziąć pełną odpowiedzialność za wszelkie nieścisłości! :-)

6

Po prostu wdrożyłem tłumaczenie ręcznie. Kod jest niezły, ale pozostawiam życzenie, aby zapewniły wsparcie bezpośrednio. Mogłem zobaczyć, że taka metoda jest użyteczna 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, to by po prostu pomnożyć przez rzeczywistych wymiarów obrazu w pikselach, ale Znormalizowane współrzędne umożliwiają odniesienie się do punktu oryginalnego respondenta, który rozwiązuje niejasność w poszczególnych przypadkach.

+1

Witam, byłoby miło zobaczyć próbkę kodu, który złożyliście razem, jeśli nadal macie go pod ręką. –

+1

Jasne, zmieniłem to w moją odpowiedź – fastcall

Powiązane problemy