AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung skalierung ermitteln TBitmap.Wrapmode = Fit
Thema durchsuchen
Ansicht
Themen-Optionen

skalierung ermitteln TBitmap.Wrapmode = Fit

Offene Frage von "Medium"
Ein Thema von Rynardald · begonnen am 19. Feb 2015 · letzter Beitrag vom 20. Feb 2015
Antwort Antwort
Rynardald

Registriert seit: 18. Sep 2014
26 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

skalierung ermitteln TBitmap.Wrapmode = Fit

  Alt 19. Feb 2015, 16:59
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.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: skalierung ermitteln TBitmap.Wrapmode = Fit

  Alt 19. Feb 2015, 17:53
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Rynardald

Registriert seit: 18. Sep 2014
26 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: skalierung ermitteln TBitmap.Wrapmode = Fit

  Alt 20. Feb 2015, 17:52
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.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: skalierung ermitteln TBitmap.Wrapmode = Fit

  Alt 20. Feb 2015, 20:13
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:48 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