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

StackOverflow https://stackoverflow.com/questions/2804

  •  08-06-2019
  •  | 
  •  

Frage

Ich habe eine Anwendung, die ein Bild in Windows Forms anzeigt PictureBox Kontrolle.Der SizeMode des Steuerelements auf eingestellt ist Zoom damit das darin enthaltene Bild PictureBox unabhängig von den Abmessungen des Bildes im richtigen Seitenverhältnis angezeigt PictureBox.

Dies wirkt sich positiv auf das visuelle Erscheinungsbild der Anwendung aus, da Sie die Größe des Fensters nach Ihren Wünschen anpassen können und das Bild immer optimal 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 wäre es einfach, vom Bildschirmraum in den Kontrollraum zu übersetzen, aber ich sehe keine offensichtliche Möglichkeit, vom Kontrollraum in den Bildraum zu übersetzen (d. h.die Pixelkoordinate im Quellbild, die im Bildrahmen skaliert wurde).

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

War es hilfreich?

Lösung

Abhängig von der Skalierung kann das relative Bildpixel eine beliebige Anzahl von Pixeln betragen.Wenn das Bild beispielsweise erheblich verkleinert wird, könnte Pixel 2, 10 2, 10 bis hin zu 20, 100 darstellen. Sie müssen also selbst rechnen und die volle Verantwortung für etwaige Ungenauigkeiten übernehmen!:-)

Andere Tipps

Am Ende habe ich die Übersetzung einfach manuell implementiert.Der Code ist nicht schlecht, aber ich wünschte, sie würden ihn direkt unterstützen.Ich konnte mir vorstellen, dass eine solche Methode unter vielen verschiedenen Umständen nützlich sein könnte.

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 Pixelabmessungen des Bildes, aber die normalisierten Koordinaten ermöglichen es Ihnen, den Standpunkt des ursprünglichen Antwortenden hinsichtlich der Lösung von Mehrdeutigkeiten von Fall zu Fall zu berücksichtigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top