Autor |
Beitrag |
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: So 09.10.05 21:24
Lossy eX hat folgendes geschrieben: | Und das mit dem Mittig ausrichten und gleich höhe/breite habe ich nicht gerallt. |
Ok, hier der Code:
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(0, 0, 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:
Delphi-Quelltext 1: 2:
| ImageX.Picture.LoadFromFile( ProportionalPicture(ImageX, Image1, ImageX.Picture.Width, ImageX.Picture.Height, 69, 69, clBtnFace) |
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: 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
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: 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.
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 Width := 200; Height := 200;
Canvas.Brush.Color := clBtnFace; Canvas.FillRect(Canvas.ClipRect);
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;
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 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 10.10.05 17:53
Lossy 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
Delphi-Quelltext 1:
| with Image1.Picture.Bitmap do begin | erhalte ich "Division durch Null", bei
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
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Di 11.10.05 09:32
galagher 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 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 11.10.05 18:01
Lossy 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! 
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
|