![]() |
Resize ohne Dimensions Verlust
Ich berechne die Position des Bildes auf diese weise.
Delphi-Quellcode:
Das Problem dabei ist das mein Bild wenn es zu groß ist gestaucht wird also die Dimensionen verändern sich.
// Gif Zentrieren
w := GifFrameRect.Width; if w > rc.Right then w := rc.Right; h := GifFrameRect.Height; if h > rc.Bottom then h := rc.Bottom; x := (rc.Right - w) / 2; y := (rc.Bottom - h) / 2; // einzelnes Bild auf Graphicsobjekt zeichnen if GDIP_DrawImageRect(GifGraphics, GifImage, x, y, w, h) = S_OK then begin Hat jemand eine Formel wie ich das Bild korrekt in den Container Zentrieren kann ohne das sich die Ausmaße verändern? Bsp. Wenn sich die höhe verändert soll sich die breite der höhe proportional anpassen so das mein Bild genau in den Container passt. Solange das Bild kleiner als der Container ist stimmt meine Formel. Ich kann das zwar selber machen aber das dauert wieder ewig ;) gruss |
AW: Resize ohne Dimensions Verlust
|
AW: Resize ohne Dimensions Verlust
Zitat:
EDIT: BOahh das ist aber ganz schön aufwendig so etwas genau zu machen nicht mit 4 Zeilen erledigt ;) Was ist mit Zitat:
gruss |
AW: Resize ohne Dimensions Verlust
Es geht um Größenänderung unter Beibehaltung der Seitenverhältnisse? Vor der Änderung das Seitenverhältnis berechnen, und dann nur eine der Dimensionen ändern, die zweite aufgrund des errechneten Verhältnisses nachziehen. Fertig. Das dürfte der erwartete Vierzeiler werden.
Edith vergaß das Einpassen: Also bitte meine Einlassung ignorieren, es ist doch nicht ganz so einfach. Sherlock |
AW: Resize ohne Dimensions Verlust
So wie ich das verstanden habe, macht die eigentliche Arbeit der Skalierung GDIP_DrawImageRect. Es geht also lediglich darum die korrekte Breite/Höhe zu ermitteln.
Das Problem sind eigentlich zwei Probleme. Du willst das Bild zentrieren und das Bildverhältnis beibehalten. Du musst dazu in einem ersten Schritt die richtige Breite/Höhe anpassen und in einem zweiten Schritt das Bild zentrieren.
Delphi-Quellcode:
Nun hast die gewünschte Breite und Höhe des Ziel-Bildes. Als nächste musst Du diese Werte benutzen um die Position zu berechnen
var
SollVerhaeltnis: Double; IstVerhaeltnis: Double; w, h: Integer; begin IstVerhaeltnis := GifFrameRect.Width / GifFrameRect.Height; SollVerhaeltnis := rc.Width / rc.Height; if IstVerhaeltnis>SollVerhaeltnis then begin w := rc.Width; h := trunc(rc.Width / IstVerhaeltnis); end else if IstVerhaeltnis<SollVerhaeltnis then begin h := rc.Height; w := trunc(rc.Height * IstVerhaeltnis); end else begin w := rc.Width; h := rc.Height; end; end;
Delphi-Quellcode:
x := (rc.Width-w) div 2 + rc.left;
y := (rc.Height-h) div 2 + rc.top; |
AW: Resize ohne Dimensions Verlust
Zitat:
gruss |
AW: Resize ohne Dimensions Verlust
Zitat:
Werde es mal einbauen und das Resultat posten :) gruss |
AW: Resize ohne Dimensions Verlust
Muste noch was ändern.
Aber so geht's. Supi und nochmals Danke..
Delphi-Quellcode:
Perfekt!
var
TargetRatio: Double; IsRelationship: Double; w, h, x, y: Single; begin // Gif Zentrieren IsRelationship := GifFrameRect.Width / GifFrameRect.Height; TargetRatio := rc.Right / rc.Bottom; if IsRelationship > TargetRatio then begin w := rc.Right; h := rc.Right / IsRelationship; end else if IsRelationship < TargetRatio then begin h := rc.Bottom; w := rc.Bottom * IsRelationship; end else begin w := rc.Right; h := rc.Bottom; end; X := (rc.Right - w) / 2; Y := (rc.Bottom - h) / 2; end; Unterschied Pics von oben und die hier. EDIT: Ich lade das Projekt heute Abend hoch zum testen muss jetzt erst mal in die Kiste. gruss |
AW: Resize ohne Dimensions Verlust
|
AW: Resize ohne Dimensions Verlust
Zitat:
Es funktioniert ja mit der Vorlage von samso. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz