Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   TImage rotieren (https://www.delphipraxis.net/216299-timage-rotieren.html)

Kevinpptx 6. Dez 2024 10:53

TImage rotieren
 
Hallo meine Lieben,

ich verzweifle seit Stunden. Ich muss ein TImage in Delphi (Windows VCL) rotieren. Mein Code:
#
Delphi-Quellcode:
unit UMain;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, System.Diagnostics,
  Vcl.StdCtrls, pngimage, System.Math.Vectors;
 
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Label1: TLabel;
    Image1: TImage;
    procedure Timer1Timer(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormActivate(Sender: TObject);
begin
  Image1.Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + '\Bilder\auto-g.png');
  DoubleBuffered := true; // Verhindert Bildflackern jetzt muss noch das abhacken rechts verhindert werde
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var a : integer;
begin
  a := strtoint(Label1.Caption);
  Inc(a);
  Label1.Caption := inttostr(a);
  Image1.Left := Image1.Left + 1;;
end;
 
end.
Ich benötige jetzt eine Prozedur, die mein Auto um eine beliebige Gradzahl dreht. Ich habe vieles versucht, auch die KI hat nicht geholfen. Ich kenne diesen Beitrag hier und diesen, aber das hilft mir alles nichts weiter, weil ich es nicht verstehe und daher nicht implementieren kann. Kann mir einfach jemand sagen, was ich konkret bei meinem Verwendungszweck coden muss, damit das funktioniert. Das Bild sollte auch danach transparent sein (mancher KI-Code hat funktioniert, aber nach der Rotation hatte das Bild die Transparenz verloren, deswegen die Erwähnung dieses Faktes).

Ich danke euch schonmal für die Hilfe. Die Lösung hier ist sehr wichtig, da es sich um mein Abschlussprojekt in der Schule handelt. Ich kann nicht verstehen, warum es in Delphi keine vorgefertigte Funktion gibt, um Sachen zu rotieren. Ich verwende Delphi 10.3.

Liebe Grüße

Blup 6. Dez 2024 12:04

AW: TImage rotieren
 
Wenn es sich um eine Abschlussprojekt der Schule handelt, sollst du sicher nicht irgendeine fertige Funktion verwenden, die dir das Ergebnis liefert.
Wie lautet den die konkrete Aufgabenstellung?
Versuch doch erst mal nur ein Rechteck zu zeichnen, mit einer Rotationsmatrix die neuen Eckpunkte zu berechnen und dann darüber das gedrehte Rechteck.
Dafür brauchst du noch nicht mal einen Computer. Das geht auch mit Papier und Taschenrechner.
Wenn du die Grundlagen verstanden hast, können wir dir bei Details in der Umsetzung in Delphi helfen.

https://en.wikipedia.org/wiki/Rotation_matrix
https://www.davdata.nl/math/rotation.html

QuickAndDirty 6. Dez 2024 12:37

AW: TImage rotieren
 
Wenn du es mit deinem Gewissen vereinbaren kannst
wäre die Lösung vermutlich hier
[SPOILER]
https://www.delphipraxis.net/168927-...en-objekt.html
[/SPOILER]

Ansonnsten einfach nach
GDI plus RotateTransform
googlen. So bin ich auf deisen Thread gestoßen.

Es ist wichtig das man lernt selber gut zu googlen.
Ich meine ich frage auch lieber nach, mir gefällt die soziale Interaktion.

jaenicke 6. Dez 2024 12:38

AW: TImage rotieren
 
Es ist durchaus nicht so, dass es dafür keine fertigen Routinen in Delphi geben würde. Die gibt es von FMX, sind aber auch in einem VCL Projekt nutzbar. Auch in der Windows API gibt es dafür mehrere Möglichkeiten. Aber wenn du die einfach nur aufrufst, ist das kaum ein Abschlussprojekt...

Nach deiner Aufgabenstellung wurde ja schon gefragt, die ist wichtig.

Kevinpptx 10. Dez 2024 12:17

AW: TImage rotieren
 
Danke an QuickAndDirty, dass er die einzige von 3 Personen war, die versucht hat, nicht den Grundsatz meiner Frage zu hinterfragen im Sinne meiner Anmerkung, dass es sich um ein Teil eines Abschlussprojektes handelt. Wieso muss man Moralapostel spielen? Wen es so stark interessiert: Dieser Code macht einen Bruchteil eines Prozents des Gesamtcodes meines Projektes aus, aber ich habe dies nicht erläutert, weil das Fremde in einem Delphi-Forum nicht angeht.

Ich verstehe leider die Komplexität dieses Artikels nicht und werde das auch nicht versuchen, weil es mir das nicht wert ist.

jaenicke 10. Dez 2024 20:49

AW: TImage rotieren
 
Wie ich schon schrieb gibt es durchaus fertige Lösungen, falls diese zur Aufgabenstellung passen. Man kann z.B. über die Windows API mit SetWorldTransform und einer Transformationsmatrix arbeiten. Die einfachste Variante ist aber das ebenfalls erwähnte FMX zu verwenden. Das geht auch in einer VCL Anwendung.
Delphi-Quellcode:
uses
  FMX.Graphics;

var
  Img: FMX.Graphics.TBitmap;
begin
  Img := FMX.Graphics.TBitmap.Create;
  try
    Img.LoadFromFile('C:\Temp\test.bmp');
    Img.Rotate(100);
    Img.SaveToFile('C:\Temp\test_rotated.bmp');
  finally
    Img.Free;
  end;
end;
Statt 100 trägst du den gewünschten Winkel ein.

Blup 12. Dez 2024 15:02

AW: TImage rotieren
 
Zitat:

Zitat von Kevinpptx (Beitrag 1544079)
Wieso muss man Moralapostel spielen?

Niemand hat hier über Moral gesprochen. Es ging einfach darum wie du der Aufgabenstellung gerecht werden kannst.

Ich vermute so ein Dreizeiler wie von jaenicke wird je nach Aufgabenstellung einfach 0 Punkte bringen.
Ein Abschlussprojekt soll normalerweise demonstrieren, was man über den gesamten Zeitraum gelernt hat.
Grundkenntnis in Geometrie sollte für die Transformation eine Rechtecks reichen.

Gausi 12. Dez 2024 15:20

AW: TImage rotieren
 
Zitat:

Zitat von Blup (Beitrag 1544141)
Grundkenntnis in Geometrie sollte für die Transformation eine Rechtecks reichen.

Diese Grundkenntnisse mögen zum Drehen eines Rechteckes ausreichen. Aber dann den Inhalt des gedrehten Rechteckes dann auch "per Hand" sinnvoll zu füllen, ist dann nicht mehr ganz so einfach, finde ich. Da müsste man wohl für jeden Pixel im gedrehten Bild bestimmen, welche Pixel des Original-Bildes zu welchem Anteil darauf gemapped werden, um die richtige Farbe zu bestimmen. Da muss man schon etwas Arbeit reinstecken, finde ich.

Wenn das aber wirklich nur ein winziger Teil des Projektes ist, dann ist das ganze Projekt vermutlich etwas komplett anderes. Dann kann man auch diese "Zauber-Funktionen" nutzen, die in den anderen Postings erwähnt wurden. :-D

Sinspin 12. Dez 2024 16:10

AW: TImage rotieren
 
Eine Transformation / Rotation um einen Winnkel der nicht durch 90 Grad teilbar ist, ist ganz schön aufwändig. Jedenfalls wenn es halbwegs ordentlich aussehen soll.
Aber ganz erhlich, hier im Forum nach sowas eine Frage zu stellen und auf eine Antwort zu warten, ist gaga.
Ein bisschen Suchen im Internet und man hat zig Lösungen vor der Nase.

Genauso gaga finde ich, sich über irgend eine der Antworten aufzuregen. Jemand der das nicht pakt, wirds im Leben nicht leicht haben. Und ganz sicher kein Programmierer.

Rollo62 12. Dez 2024 16:52

AW: TImage rotieren
 
Oder gloech ein viel effizienteres TImage32 verwenden
https://angusj.com/image32/Docs/Unit...ods/Rotate.htm


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