Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Resize ohne Dimensions Verlust (https://www.delphipraxis.net/192094-resize-ohne-dimensions-verlust.html)

EWeiss 20. Mär 2017 06:05


Resize ohne Dimensions Verlust
 
Ich berechne die Position des Bildes auf diese weise.

Delphi-Quellcode:
          // 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
Das Problem dabei ist das mein Bild wenn es zu groß ist gestaucht wird also die Dimensionen verändern sich.
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

mikhal 20. Mär 2017 07:27

AW: Resize ohne Dimensions Verlust
 
Schau dir mal meine Druckskalierung an, sollte dir weiterhelfen.

Grüße
Mikhal

EWeiss 20. Mär 2017 07:29

AW: Resize ohne Dimensions Verlust
 
Zitat:

Zitat von mikhal (Beitrag 1364802)
Schau dir mal meine Druckskalierung an, sollte dir weiterhelfen.

Grüße
Mikhal

Werde ich mal machen Danke.

EDIT:
BOahh das ist aber ganz schön aufwendig so etwas genau zu machen nicht mit 4 Zeilen erledigt ;)

Was ist mit
Zitat:

Beim Aufruf der Prozedur müssen die Druckränder bereits eingetragen sein
gemeint muss ich diese bei meinem Graphics Container berücksichtigen? Wie breit oder Hoch sind diese Werte?

gruss

Sherlock 20. Mär 2017 07:37

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

samso 20. Mär 2017 07:40

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:
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;
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
Delphi-Quellcode:
  x := (rc.Width-w) div 2 + rc.left;
  y := (rc.Height-h) div 2 + rc.top;

EWeiss 20. Mär 2017 07:41

AW: Resize ohne Dimensions Verlust
 
Zitat:

Zitat von Sherlock (Beitrag 1364804)
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.

Sherlock

Kleines Beispiel? Bin nicht der Mathe Profi. (Also dauert bei mir immer etwas länger)

gruss

EWeiss 20. Mär 2017 07:43

AW: Resize ohne Dimensions Verlust
 
Zitat:

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
Ops.. Danke.

Werde es mal einbauen und das Resultat posten :)

gruss

EWeiss 20. Mär 2017 07:52

AW: Resize ohne Dimensions Verlust
 
Muste noch was ändern.
Aber so geht's. Supi und nochmals Danke..

Delphi-Quellcode:
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;
Perfekt!
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

Rollo62 20. Mär 2017 08:30

AW: Resize ohne Dimensions Verlust
 
TRect.FitInto ?

EWeiss 20. Mär 2017 08:34

AW: Resize ohne Dimensions Verlust
 
Zitat:

Zitat von Rollo62 (Beitrag 1364810)

Muss nicht sein trotzdem Danke.
Es funktioniert ja mit der Vorlage von samso.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 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