AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Objekte drehen

Ein Thema von Mischn · begonnen am 19. Sep 2006 · letzter Beitrag vom 20. Feb 2007
Antwort Antwort
Seite 2 von 2     12   
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#11

Re: Objekte drehen

  Alt 1. Nov 2006, 11:39
Hallo Tom,

ich habe den Code so abgeändert, daß er mit beliebigen TGraphic-Nachfolgern arbeiten sollte.

Delphi-Quellcode:
// uses Math (SinCos)

// zeichnet eine verdrehte Grafik auf einem Canvas
// aAngle ist der Drehwinkel im Uhrzeigersinn in Grad
// aOffsetX, aOffsetY gibt den Offset für das Zeichnen an

procedure DrawRotatedGraphic (aCanvas: TCanvas; aGraphic: TGraphic;
                              aAngle: Double; aOffsetX, aOffsetY: Integer);
var
  svMode: Integer;
  Mat, svMat: tagXFORM;
  si, co: Extended;
begin
  // aktuellen Zustand retten
  svMode := SetGraphicsMode(aCanvas.Handle, GM_ADVANCED);
  if (svMode = GM_ADVANCED) then
    GetWorldTransform(aCanvas.Handle, svMat);
  // Verschiebung in den Usprung
  FillChar (Mat, SizeOf(Mat), 0);
  Mat.em11 := 1.0;
  Mat.em22 := 1.0;
  Mat.eDx := -(aOffsetX + aGraphic.Width / 2);
  Mat.eDy := -(aOffsetY + aGraphic.Height / 2);
  SetWorldTransform(aCanvas.Handle, Mat);
  // Verdrehung
  SinCos (aAngle * Pi / 180, si, co);
  FillChar (Mat, SizeOf(Mat), 0);
  Mat.em11 := co;
  Mat.em12 := si;
  Mat.em21 := -si;
  Mat.em22 := co;
  ModifyWorldTransform(aCanvas.Handle, Mat, MWT_RIGHTMULTIPLY);
  // Zurückschieben
  FillChar (Mat, SizeOf(Mat), 0);
  Mat.em11 := 1.0;
  Mat.em22 := 1.0;
  Mat.eDx := (aOffsetX + aGraphic.Width / 2);
  Mat.eDy := (aOffsetY + aGraphic.Height / 2);
  ModifyWorldTransform(aCanvas.Handle, Mat, MWT_RIGHTMULTIPLY);
  // Bitmap zeichnen
  aCanvas.Draw(aOffsetX, aOffsetY, aGraphic);
  // alten Zustand wiederherstellen
  if (svMode = GM_ADVANCED) then
    SetWorldTransform(aCanvas.Handle, svMat)
  else
    SetGraphicsMode(aCanvas.Handle, svMode);
end;
Gruß Hawkeye
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#12

Re: Objekte drehen

  Alt 1. Nov 2006, 12:17
Funzt schon ganz gut, aber das mit der Transparenz klappt leider nicht. Ich habe in Image2 ein Transparentes PNG, welches ich dann in Image1.Canvas gedreht zeichnen lasse, und danach sogar noch tranparent auf True stelle, aber er ignoriert das Ganze.

Im Anhang, ich hoffe, es klappt, mal das Projekt.

Upload geht bei mir heute schon den ganzen Tag nicht.

Der Download des Projektes
Danke
Tom
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#13

Re: Objekte drehen

  Alt 20. Feb 2007, 13:10
Ich wende Hawkeyes Methode aus beitrag #9 an, um ein Bitmap zu drehen. Aufrufen tue ich die Prozedur folgendermaßen:
Delphi-Quellcode:
var
  BmpSrc, BmpDest : TBitmap;
begin
  BmpSrc := TBitmap.Create;
  BmpDest := TBitmap.Create;
  try
    BmpSrc.Width := ImageEnVect1.layers[ImageEnVect1.LayersCurrent].Width;
    BmpSrc.Height := ImageEnVect1.layers[ImageEnVect1.LayersCurrent].Height;
    BmpDest.Width := ImageEnVect1.layers[ImageEnVect1.LayersCurrent].Width;
    BmpDest.Height := ImageEnVect1.layers[ImageEnVect1.LayersCurrent].Height;
    BmpSrc.Assign(ImageEnVect1.Bitmap);
    DrawRotatedBitmap(BmpSrc.Canvas, BmpDest, 10.0, , 0);
    ImageEnVect1.Bitmap.Assign(BmpDest);
    ImageEnVect1.Update;
  finally
    BmpSrc.Free;
    BmpDest.Free;
  end;
end;
Aber das Image innerhalb des Layers verschindet nur. Irgendwas mache ich da wohl noch falsch.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#14

Re: Objekte drehen

  Alt 20. Feb 2007, 13:19
Hast du nicht Quelle und Ziel vertauscht?

Delphi-Quellcode:
procedure DrawRotatedBitmap (aCanvas: TCanvas; aBitmap: TBitmap;
                             aAngle: Double; aOffsetX, aOffsetY: Integer);
aCanvas ist der Ziel-Canvas, aBitmap das Quell-Bitmap.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#15

Re: Objekte drehen

  Alt 20. Feb 2007, 13:39
So rum hatte ich es auch schon mal, das Resultat ist das gleiche.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#16

Re: Objekte drehen

  Alt 20. Feb 2007, 15:04
Zitat von Luckie:
DrawRotatedBitmap(BmpSrc.Canvas, BmpDest, 10.0, , 0);
Zwischen den beiden letzten Kommata fehlt doch die Zahl für's X-Offset, oder ist das nur'n Copy'n'Paste-Fehler?
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#17

Re: Objekte drehen

  Alt 20. Feb 2007, 21:43
Moin Luckie,

Pixelformat vom Ziel auf 24 Bit setzen hat bei mir funktioniert. Ich kann nur nicht erklären warum:
Delphi-Quellcode:
var
  BmpSrc, BmpDest : TBitmap;
begin
  BmpSrc := TBitmap.Create;
  BmpDest := TBitmap.Create;
  try
    BmpSrc.Assign(ImageEnVect1.Bitmap);

    BmpDest.Width := ImageEnVect1.layers[ImageEnVect1.LayersCurrent].Width;
    BmpDest.Height := ImageEnVect1.layers[ImageEnVect1.LayersCurrent].Height;
    BmpDest.PixelFormat := pf24bit;

    DrawRotatedBitmap(BmpDest.Canvas, BmpSrc, 10.0, 0, 0);

    ImageEnVect1.Bitmap.Assign(BmpDest);
    ImageEnVect1.Update;
  finally
    BmpSrc.Free;
    BmpDest.Free;
  end;
end;
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:32 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