Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
Delphi 10.4 Sydney
|
AW: Grafik drehen
30. Mär 2015, 17:32
Danke für die Lösungen aber [..] Wahrscheinlich habe ich irgendwo einen Denkfehler. Bin für alle Lösungen offen
Ja, ist etwas tricky. Man muß dabei berücksichtigen das dein Drehpunkt (Center) nicht der Drehpunkt von SetWorldTransform ist. Hab Dir mal ein paar Methoden rauskopiert.
Ich hoffe damit nicht wieder ein "Vorsagen-Verstoß" begangen zu haben..
Delphi-Quellcode:
type
TRotationZoomCanvas = class
private
procedure SetCanvas(const Value: TCanvas);
protected
FCanvas: TCanvas;
FAngle: double;
FZoom: double;
procedure SetRotationZoom(OffsetX, OffsetY: double);
procedure Reset;
public
procedure Draw(X, Y: integer; Graphic: TGraphic);
procedure StretchDraw(ARect: TRect; Graphic: TGraphic);
property Canvas: TCanvas read FCanvas write SetCanvas;
property Angle: double read FAngle write FAngle;
property Zoom: double read FZoom write FZoom;
end;
implementation
procedure TRotationZoomCanvas.SetCanvas(const Value: TCanvas);
begin
FCanvas := Value;
SetGraphicsMode(FCanvas.Handle, GM_ADVANCED);
// SetMapMode(FCanvas.Handle, MM_ANISOTROPIC);
FZoom := 1;
end;
procedure TRotationZoomCanvas.Draw(X, Y: integer; Graphic: TGraphic);
var
O: TPoint;
begin
O.X := X + Graphic.Width div 2;
O.Y := Y + Graphic.Height div 2;
SetRotationZoom(O.X, O.Y);
FCanvas.Draw(X - O.X, Y - O.Y, Graphic);
Reset;
end;
procedure TRotationZoomCanvas.StretchDraw(ARect: TRect; Graphic: TGraphic);
var
O: TPoint;
begin
O.X := (ARect.Left + ARect.Right) div 2;
O.Y := (ARect.Top + ARect.Bottom) div 2;
SetRotationZoom(O.X, O.Y);
FCanvas.StretchDraw(Rect(ARect.Left - O.X, ARect.Top - O.Y,
ARect.Right - O.X, ARect.Bottom - O.Y), Graphic);
Reset;
end;
procedure TRotationZoomCanvas.Reset;
var
Angle, Zoom: double;
begin
Angle := FAngle;
Zoom := FZoom;
FAngle := 0;
FZoom := 1;
SetRotationZoom(0, 0);
FAngle := Angle;
FZoom := Zoom;
end;
procedure TRotationZoomCanvas.SetRotationZoom(OffsetX, OffsetY: double);
var
Mat: tagXFORM;
C, S: double;
begin
C := FZoom * Cos(0.0174532925199433 * FAngle);
S := FZoom * Sin(0.0174532925199433 * FAngle);
Mat.eM11 := C;
Mat.eM12 := S;
Mat.eM21 := -S;
Mat.eM22 := C;
Mat.eDx := OffsetX;
Mat.eDy := OffsetY;
SetWorldTransform(FCanvas.Handle, Mat);
end;
..
procedure TCanvasToolsExampleForm.Button1Click(Sender: TObject);
begin
FRotationZoomCanvas.Canvas := Canvas;
FRotationZoomCanvas.Zoom := 1.5;
FRotationZoomCanvas.Angle := 30;
FRotationZoomCanvas.Draw(100, 100, FBitmap);
end;
|
|
Zitat
|