c# - Wie soll ich in einer WinForms PictureBox von Bildschirmraumkoordinaten in Bildraumkoordinaten übersetzen?

Translate

Ich habe eine Anwendung, die ein Bild in einem Windows Forms anzeigtPictureBoxSteuerung. DasSizeModeder Steuerung ist auf eingestelltZoomso dass das in derPictureBoxwird unabhängig von den Abmessungen des aspektrichtig angezeigtPictureBox.

Dies ist ideal für das visuelle Erscheinungsbild der Anwendung, da Sie das Fenster beliebig dimensionieren können und das Bild immer mit der besten Anpassung angezeigt wird. Leider muss ich auch Mausklickereignisse auf dem Bildfeld verarbeiten und in der Lage sein, von Bildschirmraumkoordinaten in Bildraumkoordinaten zu übersetzen.

Es sieht so aus, als ob es einfach ist, vom Bildschirmraum in den Kontrollraum zu übersetzen, aber ich sehe keine offensichtliche Möglichkeit, vom Kontrollraum in den Bildraum zu übersetzen (dh die Pixelkoordinate im Quellbild, die im Bildfeld skaliert wurde).

Gibt es eine einfache Möglichkeit, dies zu tun, oder sollte ich einfach die Skalierungsmathematik duplizieren, die sie intern verwenden, um das Bild zu positionieren und die Übersetzung selbst durchzuführen?

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Abhängig von der Skalierung kann sich das relative Bildpixel an einer beliebigen Stelle in einer Anzahl von Pixeln befinden. Wenn das Bild beispielsweise erheblich verkleinert wird, können Pixel 2, 10 2, 10 bis zu 20, 100) darstellen. Sie müssen also selbst rechnen und die volle Verantwortung für etwaige Ungenauigkeiten übernehmen! :-)

Quelle
Translate

Ich habe die Übersetzung nur manuell implementiert. Der Code ist nicht schlecht, aber ich wünschte mir, sie würden ihn direkt unterstützen. Ich konnte sehen, dass eine solche Methode unter vielen verschiedenen Umständen nützlich ist.

Ich denke, deshalb haben sie Erweiterungsmethoden hinzugefügt :)

Im Pseudocode:

// 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 im Bild zu erhalten, multiplizieren Sie einfach mit den tatsächlichen Bildpixelabmessungen. Mit den normalisierten Koordinaten können Sie jedoch den Punkt des ursprünglichen Antwortenden zur Auflösung von Mehrdeutigkeiten von Fall zu Fall ansprechen.

Quelle