Wie soll ich das übersetzen von Platz auf dem Bildschirm Bildraumkoordinaten in einer WinForms PictureBox-Koordinaten?

stimmen
13

Ich habe eine Anwendung , die ein Bild innerhalb eines Windows Forms zeigt PictureBoxKontrolle. Die SizeModevon der Steuerung festgelegt ist , Zoomso dass das Bild in der enthalten PictureBoxwird , unabhängig von den Abmessungen des in ein Seitenrichtige Weise angezeigt werden PictureBox.

Dies ist ideal für das optische Erscheinungsbild der Anwendung, weil Sie das Fenster jedoch können Größe, die Sie wollen, und das Bild wird immer mit seiner besten geeignet angezeigt werden. Leider muss ich auch per Mausklick Ereignisse auf dem Bildfeld zu handhaben und müssen von Bildschirm-Raum-Koordinaten in Bildraumkoordinaten übersetzen zu können.

Es sieht aus wie es einfach ist, von Platz auf dem Bildschirm zu übersetzen Raum zu kontrollieren, aber ich sehe keine offensichtliche Art und Weise sehen von dem Steuerraum in dem Bildraum (dh die Pixel-Koordinate in dem Quellenbild, das in dem Bildfeld skaliert wurde) zu übersetzen.

Gibt es eine einfache Möglichkeit, dies zu tun, oder soll ich nur die Skalierung Mathe duplizieren, dass sie intern verwenden, das Bild zu positionieren und die Übersetzung selbst tun?

Veröffentlicht am 05/08/2008 um 21:28
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
6

Ich zog nur manuell die Übersetzung zu implementieren. Der Code ist nicht allzu schlecht, aber es hat mich verlassen wollen, dass sie direkt an den Support für sie zur Verfügung gestellt. Ich konnte sehen, ein solches Verfahren nützlich zu sein in vielen verschiedenen Umständen.

Ich denke, das ist, warum sie Erweiterungsmethoden hinzugefügt :)

In Pseudo-Code:

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

Um die Pixelposition in dem Bild zu erhalten, würden Sie nur die eigentlichen Bildpixelabmessungen multiplizieren, aber die normalisierten Koordinaten können Sie die Original-Responder des Punkt ansprechen zu lösen Zweideutigkeit auf einer Fall-zu-Fall-Basis.

Beantwortet am 06/08/2008 um 05:25
quelle vom benutzer

stimmen
1

Je nach Skalierung, könnten die relativen Bildpixel sein irgendwo in einer Anzahl von Pixeln. Zum Beispiel, wenn das Bild deutlich verkleinert wird, Pixel 2 kann 10 repräsentieren 2, 10 die ganzen Weg bis zu 20, 100), so dass Sie die Mathematik selbst zu tun haben und die volle Verantwortung für etwaige Ungenauigkeiten nehmen! :-)

Beantwortet am 05/08/2008 um 21:33
quelle vom benutzer

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