Autor Beitrag
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: So 09.10.05 21:24 
user profile iconLossy eX hat folgendes geschrieben:
Und das mit dem Mittig ausrichten und gleich höhe/breite habe ich nicht gerallt.

Ok, hier der Code:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
procedure ProportionalPicture(Image, DestImage: TImage;
 SourceWidth, SourceHeight, DestWidth, DestHeight: Integer; HGColor: TColor);
var
  I, L, T, Xnew, Ynew, H, W: Integer;
begin
 with DestImage do
 begin
  Picture.Graphic := nil;
  Canvas.Brush.Color := HGColor;
  Canvas.FillRect(Rect(00, Width, Height));
 end;

 Xnew := (SourceWidth * DestWidth) div SourceHeight;
 Ynew := (DestHeight * SourceHeight) div SourceWidth;

 L := 0;
 T := 0;
 for I := Xnew to DestWidth do Inc(L);
 for I := Ynew to DestHeight do Inc(T);

 W := DestWidth div 3;
 H := DestHeight div 3;

 if Xnew > Ynew then
  DestImage.
   Canvas.StretchDraw(Rect(L div 2, T div 2, Xnew-W, Ynew+T div 2),Image.Picture.Graphic)
 else if Xnew < Ynew then
  DestImage.
   Canvas.StretchDraw(Rect(L div 2, T div 2, Xnew+L div 2, Ynew-H),Image.Picture.Graphic)
 else if Xnew = Ynew then
  DestImage.Canvas.StretchDraw(Rect(L, T, Xnew, Ynew),Image.Picture.Graphic);
end;


Wenn DestWidth ungleich DestHeight ist, treten Verzerrungen auf. Ansonsten wird das Bild proportional korrekt eingepasst. Das Ganze wird also so aufgerufen:
ausblenden Delphi-Quelltext
1:
2:
 ImageX.Picture.LoadFromFile(//FileName
 ProportionalPicture(ImageX, Image1, ImageX.Picture.Width, ImageX.Picture.Height, 6969, clBtnFace)

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: So 09.10.05 22:20 
Wenn du das Bild eh schon kleiner gerechnet hast, dann könntest du auch Draw anstelle von Stretchdraw verwenden. Du musst es ja nicht strechten. Anderenfall schaue ich mir morgen in ruhe noch mal deinen Code an. Habe jetzt keine Zeit und bin nicht mehr so richtig aufnahmefähig.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Mo 10.10.05 09:05 
Okay. Ich sehe gerade anhand von deinem Code, dass du die Bilder nicht runter rechnest sondern lediglich kleiner Zeichnest. Also das mit den variablen T und L? Hast du mal genau überlegt, was du damit veranstaltest? Du setzt sie auf 0 und anschließend erhöhst du sie in einer Schleife. Du könntest auch DestWidth - XNew ausrechnen um das zu bekommen. Aber egal. Das geht alles viel einfacher als du denkst.

Versuch es mal so.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure TForm1.Button1Click(Sender: TObject);
var
  NewWidth, NewHeight, OffsetX, OffsetY: Integer;
begin
  with Image1.Picture.Bitmap do begin
    // Größe setzen und Hintergrund löschen
    Width := 200;
    Height := 200;

    Canvas.Brush.Color := clBtnFace;
    Canvas.FillRect(Canvas.ClipRect);

    // neue Bildgröße berechnen
    NewWidth := 200;
    NewHeight := 200;

    if Image2.Picture.Width > Image2.Picture.Height
      then NewHeight := 200 * Image2.Picture.Height div Image2.Picture.Width
      else NewWidth := 200 * Image2.Picture.Width div Image2.Picture.Height;

    // Bild Zentriert darstellen
    OffsetX := (Width - NewWidth) div 2;
    OffsetY := (Height - NewHeight) div 2;

    Canvas.StretchDraw(
      Rect(OffsetX, OffsetY, OffsetX + NewWidth, OffsetY + NewHeight),
      Image2.Picture.Graphic);
  end;
end;


Nicht wundern meine Zielgröße ist 200x200 Pixel. Aber das Prinzip sollte klar sein. (Hoffe ich jedenfalls) Und wie du daran siehst kann man das mit einem ganz simplen Dreisatz lösen. Die Ausrichtung erfolgt mithilfe ganz normaler Subtraktion und einem Div.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 10.10.05 17:53 
user profile iconLossy eX hat folgendes geschrieben:
Okay. Ich sehe gerade anhand von deinem Code, dass du die Bilder nicht runter rechnest sondern lediglich kleiner Zeichnest. Also das mit den variablen T und L? Hast du mal genau überlegt, was du damit veranstaltest? Du setzt sie auf 0 und anschließend erhöhst du sie in einer Schleife.

Ich setzt T und L deshalb zunächst auf 0, da sie als lokale variablen diesen Wert ja nicht automatisch haben. Kleiner zeichnen ist doch das Ziel der ganzen Aktion :| ! Leider funktioniert dein Code nicht, trotzdem danke! Bei
ausblenden Delphi-Quelltext
1:
 with Image1.Picture.Bitmap do begin					
erhalte ich "Division durch Null", bei

ausblenden Delphi-Quelltext
1:
 with Image1.Picture.Graphic do begin					
erhalte ich a) bei Bitmaps "Division durch Null", b) bei JPEG's "Die Grösse einer JPEG-Grafik kann nicht geändert werden".

L und T dienen nur dazu, Left und Top zu bestimmen, ab hier soll gezeichnet werden. Ich werde mir anschauen, wie man das vereinfachen kann.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Di 11.10.05 09:32 
user profile icongalagher hat folgendes geschrieben:
L und T dienen nur dazu, Left und Top zu bestimmen, ab hier soll gezeichnet werden. Ich werde mir anschauen, wie man das vereinfachen kann.

Das meine ich ja damit. Diese Aktion die du per Schleife durchführst, die kann man auch berechnen. Und das kostet nicht mal einen Bruchteil der Zeit den du mit den Schleifen vergeudest.

Zu dem Code. Ich habe fast befürchtest, dass du den einfach so direkt kopieren wirst. Ich habe gehoft, dass du es nicht tun wirst. Aber du hast es getan. Den Code kannst du natürlich nicht einfach so kopieren! Du müsstest den schon auf deine Bedürftnisse anpassen.

In dem Code greife ich direkt auf meine beiden Images zu. Die aber nur existieren, weil es für mich einfacher ist. Du müsstest die natürlich als Parameter übergeben. Oder die TPictures als Parameter! Was ich persönlich für Sinnvoller halte, da du diese aus Standalone erstellen kannst. Sonst bist du immer an eine Komponente gebunden. Die Größe setze ich bei dem Zielbild. Das ist zu Begin noch leer und wird ja letzten Endes mit dem anderen Bild gefüllt. Was ich nur zum Zeichnen verwende und das geht 100%tig. Ich habe es selber ausprobiert.


PS: Ich kann dir nur dringenst raten dich (noch) mal mit den Grundlagen der Softwareentwicklung zu beschäftigen. Auf mich hat es den nämlich den Anschein als ob du nicht genau weißt was du tust. Sondern es einfach nur so tust. Sonst hättest du wohl den Code von mir verstanden und umsetzen können.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 11.10.05 18:01 
user profile iconLossy eX hat folgendes geschrieben:
Zu dem Code. Ich habe fast befürchtest, dass du den einfach so direkt kopieren wirst. Ich habe gehoft, dass du es nicht tun wirst. Aber du hast es getan. Den Code kannst du natürlich nicht einfach so kopieren! Du müsstest den schon auf deine Bedürftnisse anpassen.

Zuerst wollte ich ihn natürlich testen, also mit einem Button1, Image1 und Image2. Habe aber übersehen, dass das Bild in Image2 in Image1 gezeichnet werden soll, nicht umgekehrt, habe deshalb in Image1 eine Grafik geladen und liess Image2 leer. Umgekehrt funktioniert es natürlich und ich setze deinen Code bereits ein!

Er ist aber nur minimal schneller als meiner - bei 89 JPEG's, 1024x768 Pixel, um etwa 5 Sekunden. Eleganter ist er allemal, zugegeben.

Danke für deine Hilfe! :D

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!