Wie kann ich XY-Koordinaten und Höhe / Breite eines skalierten Bildes in ein Originalformat umwandeln?

8

Verwandte Frage

Ich versuche das Gleiche zu tun wie in der verknüpften Frage, aber mit C #. Ich zeige ein skaliertes Bild und erlaube einem Benutzer, einen Bereich zum Zuschneiden auszuwählen. Allerdings kann ich nicht einfach die x1y1, x2y2 Koordinaten aus der skalierten Bildauswahl nehmen und diese vom Original abschneiden. Ich habe versucht, einige grundlegende Mathematik wie in der anderen Frage zu tun, aber das ist natürlich auch nicht der richtige Ansatz (es ist definitiv näher).

Bearbeiten

Originalbildabmessungen: w = 1024 h = 768

Skalierte Bildabmessungen: w = 550 h = 412

Ich beginne mit einem Bild, sagen wir 1024x768. Ich möchte, dass es so groß wie möglich in einer 550x550 Box passt. Ich verwende die folgende Methode, um die skalierte Bildgröße zu erhalten (unter Beibehaltung des Seitenverhältnisses). Dann mache ich eine grundlegende Anpassung an diese neuen Dimensionen.

Wie bei einem Auswahlbereich kann es sich um alles (0,0) bis (100,100) handeln.

%Vor%     
scottm 14.02.2011, 16:39
quelle

2 Antworten

7

Ohne ein bisschen mehr Detail, ich vermute, dass Sie tatsächlich von Rundungsfehlern leiden ...
- Wenn Sie die (obere, linke) Koordinate zurück auf das Original skalieren, müssen Sie abrunden (nach oben links).
- Wenn Sie die (untere, rechte) Koordinate zurück auf das Original skalieren, müssen Sie aufrunden (nach rechts unten)

Nehmen Sie ein einfaches Beispiel für ein 12x12-Gitter als Original und ein 4x4-Gitter als skalierte Version.
- (1,1) :( 2,2) in der skalierten Version = (3,3) :( 8,8)
- 2x2 Pixel = 25% der Fläche der skalierten Version
- 6x6 Pixel = 25% der Fläche der ursprünglichen Version

Wenn man einfach mit den gleichen Skalierungsfaktoren multiplizieren würde, würde dies (3,3): (6,6) ergeben.


OriginalTop = INT (ScaledTop * YScalingFactor); OriginalLeft = INT (ScaledLeft * XScalingFactor);

OriginalBottom = INT ((SkalierterBottom + 1) * YScalingFactor) - 1;
OriginalRight = INT ((ScaledRight + 1) * XScalingFactor) - 1;


BEARBEITEN :

Eine bessere Art zu erklären, was ich sagen möchte, wäre ein Bild zu zeichnen. Und ich sauge an ASCII Art. Also hier ist ein weiterer Versuch mit Worten.

Ein Pixel ist kein Punkt. Es ist ein kleines Rechteck in seinem eigenen Recht.

Wenn Sie ein Pixel verwenden, um die obere linke Ecke eines Rechtecks ​​darzustellen, fügen Sie den Bereich vom oberen linken Punkt des Pixels ein.

Wenn Sie ein Pixel verwenden, um Unten rechts eines Rechtecks ​​darzustellen, fügen Sie den Bereich bis zum Unten rechts Punkt des Pixels ein.


Verwenden der (12x12) = & gt; (4x4) Beispiel: Jedes skalierte Pixel repräsentiert eine ganze 3x3 Pixelmenge im Original. Wenn Sie oben links sprechen, wählen Sie das oberste linke Pixel der 3x3-Pixel-Gruppe im Original aus. Und wenn Sie über die untere rechte Seite sprechen, wählen Sie die untere rechte Ecke der 3x3-Pixel-Gruppe im Original aus.


BEARBEITEN : Nur ganze Zahlen verwenden.

%Vor%


Sie müssen nur sicherstellen, dass Sie nach der Multiplikation den Datentyp nicht überlaufen lassen. Aber mit Bildern, werden Sie nicht, es sei denn, es ist ein höllisches Bild.

    
MatBailie 14.02.2011, 16:57
quelle
0

Sie können die prozentualen Positionen für die skalierten Bilder abrufen und sie für das unskalierte Bild in Koordinaten umwandeln:

%Vor%     
Justin808 14.02.2011 16:53
quelle

Tags und Links