Danke für die Lösungen aber
Die ScanLine Methode funktioniert in diesem Fall nicht weil ich meine Bitmap so verschiebe, dass die Mitte auf (0|0) liegt,
es dann gedreht wird und schließlich wieder zurück verschoben wird. Und mit ScanLine ist mein Bitmap nach der ersten Verschiebung außerhalb des Bereichs.
Hier mal bisschen Quellcode zu Scan Line:
Delphi-Quellcode:
VAR PixelsAlt,PixelsNeu: PRGBTripleArray;
for yalt := 0 to Hoehe-1 do
begin
PixelsAlt := BildKopie.ScanLine[yalt];
for xalt := 0 to Breite-1 do
begin
xneu:=round((xalt-xm)*c-(yalt-ym)*s)+xm;
yneu:=round((xalt-xm)*s+(yalt-ym)*c)+ym;
//NeuesBild.Canvas.Pixels[xneu,yneu]:=BildKopie.Canvas.Pixels[xalt,yalt];
PixelsNeu := NeuesBild.ScanLine[yneu];
PixelsNeu[xneu]:=PixelsAlt[xalt];
end;
end;
Lösung Nummer 2 klingt sehr schön aber funktioniert leider nicht.
(EDIT: Es ist keine Veränderung auf dem Image sichtbar. )
Delphi-Quellcode:
Procedure TForm1.SetCanvasZoomAndRotation(ACanvas: TCanvas; Zoom: Double; Angle: Double; CenterpointX, CenterpointY: Double);
var
form: tagXFORM;
rAngle: Double;
begin
rAngle := DegToRad(Angle);
SetGraphicsMode(ACanvas.Handle, GM_ADVANCED);
SetMapMode(ACanvas.Handle, MM_ANISOTROPIC);
form.eM11 := Zoom * Cos(rAngle);
form.eM12 := Zoom * Sin(rAngle);
form.eM21 := Zoom * (-Sin(rAngle));
form.eM22 := Zoom * Cos(rAngle);
form.eDx := CenterpointX;
form.eDy := CenterpointY;
SetWorldTransform(ACanvas.Handle, form);
end;
procedure TForm1.BT_DrehenClick(Sender: TObject);
Var BildKopie:TBitmap;
begin
BildKopie:=TBitmap.Create;
BildKopie.SetSize(Image1.Width,Image1.Height);
BildKopie.Canvas.Draw(0,0,Image1.Picture.Graphic);
SetCanvasZoomAndRotation(BildKopie.Canvas,1,strtofloat(ED_Grad.Text),Image1.Width/2,Image1.Height/2);
Image1.Picture.Bitmap := nil;
Image1.Picture.Assign(BildKopie);
BildKopie.Free;
end;
Habe auch schon versucht das Image direkt zu drehen mit :
SetCanvasZoomAndRotation(Image1.Picture.Bitmap.Canvas,...);
Wahrscheinlich habe ich irgendwo einen Denkfehler.
Bin für alle Lösungen offen