Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   skalierung ermitteln TBitmap.Wrapmode = Fit (https://www.delphipraxis.net/184016-skalierung-ermitteln-tbitmap-wrapmode-%3D-fit.html)

Rynardald 19. Feb 2015 15:59

skalierung ermitteln TBitmap.Wrapmode = Fit
 
Ich hab folgendes Szenario:
Bild 1 wird in einem TImage mit TImageWrapMode.Fit angezeigt und skaliert da es zu groß ist.
Für einen Abgleich mit einem zweiten Bild (welches nicht skaliert wird) brauche ich das SkalierungsVerhältnis von Bild 1 um das ganze wieder zurückrechnen zu können.

Medium 19. Feb 2015 16:53

AW: skalierung ermitteln TBitmap.Wrapmode = Fit
 
Für einen Vergleich ist der Ansatz denkbar schlecht. Beim Verkleinern gehen dir Informationen unwiederbringlich flöten. Du solltest deine Bilder in ihrer Originalgröße intern vorhalten und mit diesen dann arbeiten, und das skalierte nur zur Anzeige verwenden. Ansonsten werden die Ergebnisse fast sicher entweder schlecht, oder zumindest schwer vorhersehbar.

Edit: Öhm, und wenn mich nicht alles täuscht nimmt dir TImage das doch sogar ab: Das interne TImage.Picture.Bitmap dürfte das unskalierte Original beinhalten. Nimm das doch einfach.

Rynardald 20. Feb 2015 16:52

AW: skalierung ermitteln TBitmap.Wrapmode = Fit
 
Das zweite Bild ist fast dasselbe wie der erste nur das es in graustufen gehalten ist und eingezeichnete Regionen für Bild 1 enthält. Nun muss ich bei einem Mouseover oder Mouseklick auf dem ersten Bild, auf dem zweiten nachsehen zu welcher Region das angeklickte Pixel gehört und darauf reagieren. Daher sind mir kleine Qualitätfehler nicht so wichtig. Ohne das genaue Skalierungsverhältnis jedoch kann ich das MouseOver- und MouseClick-Event nicht korrekt auf Bild 2 zurückrechnen.

Medium 20. Feb 2015 19:13

AW: skalierung ermitteln TBitmap.Wrapmode = Fit
 
Okay, dann anders:
Ich nehme mal an, dass "Fit" heisst, dass das Bild unter Beibehaltung des Seitenverhältnisses skaliert, und nicht wirklich mit Gewalt das Bitmap auf die ganze Anzeige staucht. In dem Fall musst du zunächst das Bildverhältnis des TImage ermitteln: Vi = Image.Breite / Image.Höhe
Das gleiche für das Original-Bitmap: Vb = Bitmap.Breite / Bitmap.Höhe

Wenn Vi > Vb, dann wird das Bitmap in Y-Richtung nachher genau so hoch sein wie das Image. Wenn Vb > Vi, dann wird das Bitmap nachher genau so breit sein wie das Image. Dein Skalierungsfaktor ist dann je nach Fall entweder (Image.Breite / Bitmap.Breite) oder (Image.Höhe / Bitmap.Höhe).

Wenn "Fit" wirklich auf das gesamte Image staucht, brauchst du beide Faktoren und musst die X und Y Koordinaten mit ihren jeweils eigenen Faktoren umrechnen.

Bleibt noch die Frage, ob das Bitmap in der Richtung, in der etwas "über" ist zentriert wird oder nicht. Wenn nicht, ist nichts weiter zu tun. Wenn doch, dann musst du noch folgendes ermitteln:
Von der Achse, die nachher nicht vollständig auf das Image gezogen wird: Offset = (Image.Achse - (Bitmap.Achse * Skalierungsfaktor)) / 2
Dieses Offset musst du dann nacher von den noch nicht umgerechneten Mauskoordinaten (nur auf die entsprechende Achse natürlich) subtrahieren, um den entstandenen Rand zwischen Bitmap und Image zu berücksichtigen.

Alles nur Realschulmathe, keine Bildvergleiche oder sowas für so etwas einfaches! Das wäre mit einem B-52 auf einen Sperling geschossen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz