[Delphi]TBitmap Drehen

pchero

Ensign
Registriert
Juni 2006
Beiträge
170
Hi

wir machen grade im Informatik Unterricht ein bisschen Delphi, und momentan sollen wir ein TBitmap um 90 Grad drehen. Es geht momentan nicht um Performance usw usf... Sondern einfach nur den schüler damit vertraut zu machen . Deswegen wird auch die Pixel weise zuweisung verwendet. und nicht Scanlines oder so.


Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Bearbeiten1: TMenuItem;
    ffnen1: TMenuItem;
    Speichern1: TMenuItem;
    Beenden1: TMenuItem;
    OpenDialog1: TOpenDialog;
    N90Drehen1: TMenuItem;
    Spiegeln1: TMenuItem;
    SaveDialog1: TSaveDialog;
    Speichernunter1: TMenuItem;
    Leeren1: TMenuItem;
    procedure ffnen1Click(Sender: TObject);
    procedure N90Drehen1Click(Sender: TObject);
    procedure Leeren1Click(Sender: TObject);
    procedure FormClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  bild: Tbitmap;
  bild1: Tbitmap;
implementation

{$R *.dfm}

procedure TForm1.ffnen1Click(Sender: TObject);
var     x,y  : Integer;
begin
  OpenDialog1.Execute;
  bild := Tbitmap.Create;
  bild1 := Tbitmap.Create;
  bild.LoadFromFile(OpenDialog1.FileName);
  {bild1.LoadFromFile(OpenDialog1.FileName);}
  for y:=1 to bild.Height do
    for x:=1 to bild.Width do
      form1.Canvas.Pixels[x,y] := bild.Canvas.Pixels[x,y];

  Speichern1.Enabled:=True;
  Speichernunter1.Enabled:=True;
  Bearbeiten1.Enabled:=True;

  Form1.Width:=bild.Width+50;
  Form1.Height:=bild.Height+50;
end;

procedure TForm1.N90Drehen1Click(Sender: TObject);
var     x,y  : Integer;

begin
   bild1.Assign(bild);                 //Duplizieren
   bild1.Width:=bild.Height;           //Neu Größe
   bild1.Height:=bild.Width;


   Form1.Width:=bild1.Width+50;        //TForm1 der Bildgröße anpassen
   Form1.Height:=bild1.Height+50;


   with Canvas do FillRect(ClipRect); //TForm Leeren
   for y:=1 to bild.Height do         //Bild drehen
     for x:=1 to bild.Width do
      bild1.Canvas.Pixels[x,bild1.Height-y-1] := bild.Canvas.Pixels[y,x];

   for y:=1 to bild1.Height do        //Bild darstellen lassen
     for x:=1 to bild1.Width do
       form1.Canvas.Pixels[x,y] := bild1.Canvas.Pixels[x,y];
   bild.Assign(bild1);                //Bild zurückspielen



end;

procedure TForm1.Leeren1Click(Sender: TObject);
begin
 with Canvas do FillRect(ClipRect);

 Speichern1.Enabled:=False;
 Speichernunter1.Enabled:=False;
 Bearbeiten1.Enabled:=False;

 bild1.Free;
 bild.Free;
end;


procedure TForm1.FormClick(Sender: TObject);
var     x,y  : Integer;
begin
    if OpenDialog1.FileName <> '' then
    begin
      for y:=1 to bild.Height do
       for x:=1 to bild.Width do
        form1.Canvas.Pixels[x,y] := bild.Canvas.Pixels[x,y];
    end;

end;



end.


Es geht momentan nur um das drehen von 90 Grad und das soll auch mehrfach möglich sein

Das problem ist einfach , das wenn ein Bild nicht Quadratisch ist Ecken abgeschnitten werden.

MFG
 
Zuletzt bearbeitet:
aus

Form1.Width:=bild1.Width+50; //TForm1 der Bildgröße anpassen
Form1.Height:=bild1.Height+50;

Entsprechend auch die neuen Dimensionen des Bitmaps setzen. Sinnvoller wäre aber mit Src- und Destination-Bitmap zu arbeiten und diese Prozedur in eine eigene Unit auszulagern.

wird

Form1.Height:=bild1.Width+50; //TForm1 der Bildgröße anpassen
Form1.Width:=bild1.Height+50;
 
hmm die größen vom Fenster usw stimmen ja nur er schneidet nen Teil ab

Den Fehler sieht man gut auf dem Angehängten Bild.

MFG
 

Anhänge

  • Fehler.JPG
    Fehler.JPG
    36,5 KB · Aufrufe: 185
Sei mir nicht böse, aber ich kann Deinen Code nur sehr schwer lesen. Da ist soviel so umständlich gelöst. Arbeite mit 2 TBitmaps und benutze die eigenen Routinen dieser Klassen um sie auf dem Form zeichnen zu lassen, bzw. verwende eine entsprechende visuelle Komponente, die das übernimmt.

Die gibt es... Dann kannst Du Dir den Mist mit dem Zeichnen auf dem Formular sparen - ganz abgesehen davon, dass es einfacher geht macht man sowas auch erst gar nicht.
 
ok tut mir auch leid das man den Code net lesen kann, aber ich hatte bis jetzt Delphi nur in der Schule in 6 Stunden Informatik Unterricht! Und unser Leh/(e)rkörper hat uns das mit den Methoden gezeigt auf das TForm zu zeichnen. Aus meiner sicht is es uch Sinnvoller ein Image zu verwenden. Weiß du zufällig wie ich das dann konvertieren muss da ich das ja als TBitmap habe und es ja als TPicture dahin muss.

Ich bin in Delphi net zuhause ich bin eher So PHP&MySql; Html usw..

MFG
 
Guck Dir mal TPicture an, das hat garantiert eine Eigenschaft vom Typen TBitmap... Anders könntest Du auch über Canvas.Brush arbeiten und das Bitmap als "Stempel" nutzen, wenn es unbedingt direkt auf das Form gezeichnet werden muss - was Blödsinn ist...

Es geht auch ganz klassisch über BitBlt...

Sicherlich gibt es noch 500 andere Möglichkeiten.
 
Wenn Du es ganz richtig machen willst, dann schau Dir SetWorldTransform in der Win32SDK-Hilfe an. Damit kannst Du nämlich direkt drehen lassen - Windows dreht dann für Dich, Du musst nichts mehr von Hand machen.

Allerdings um das zu verstehen - naja, da bedarf es schon einiger Mathematik.
 
Zurück
Oben