Hallo,
Habe vorhin
diesen Beitrag gefunden zur Bildertransformation.
Das Beispiel mit der Rotation funktioniert auch.
Ich wollte jetzt das Bild zu einem Trapez transformieren, mit dem Graphics32-
Package habe ich das schon versucht, das Ergebnis ohne Interpolation reicht mir aber nicht.
hab mich an das
Beispiel gehalten, DrawImage liefert aber Status not Implemented.
Delphi-Quellcode:
procedure RotateBitmap(Bmp: TBitmap; Degs: Integer; AdjustSize: Boolean;
BkColor: TColor = clNone);
var
Tmp: TGPBitmap;
Matrix: TGPMatrix;
// C: Single;
// S: Single;
// NewSize: TSize;
Graphs: TGPGraphics;
Pnts: Array of TGPPointF;
PPnts : PGPPointF;
status : TStatus;
begin
Tmp := TGPBitmap.Create(Bmp.Handle, Bmp.Palette);
Matrix := TGPMatrix.Create;
try
Matrix.RotateAt(Degs, MakePoint(0.5 * Bmp.Width, 0.5 * Bmp.Height));
// if AdjustSize then
// begin
// C := Cos(DegToRad(Degs));
// S := Sin(DegToRad(Degs));
// NewSize.cx := Round(Bmp.Width * Abs(C) + Bmp.Height * Abs(S));
// NewSize.cy := Round(Bmp.Width * Abs(S) + Bmp.Height * Abs(C));
// Bmp.Width := NewSize.cx;
// Bmp.Height := NewSize.cy;
// end;
Graphs := TGPGraphics.Create(Bmp.Canvas.Handle);
try
Graphs.Clear(ColorRefToARGB(ColorToRGB(BkColor)));
SetLength(Pnts, 4);
Pnts[0].X := 48;
Pnts[0].Y := 0;
Pnts[1].X := Bmp.Width-5;
Pnts[1].Y := 43;
Pnts[2].X := Bmp.Width-103;
Pnts[2].Y := Bmp.Height+37;
Pnts[3].X := 4;
Pnts[3].Y := Bmp.Height-29;
Graphs.SetInterpolationMode(InterpolationModeHighQuality);
PPnts := @Pnts[0];
status := Graphs.DrawImage(Tmp, PPnts, 4);
if status <> Ok then
showmessage('kaputt');
// Graphs.DrawImage(Tmp, PPnts, 4, 0, 0, 200, 200, UnitPixel);
// Graphs.SetTransform(Matrix);
// status := Graphs.DrawImage(Tmp, (Cardinal(Bmp.Width) - Tmp.GetWidth) div 2,
// (Cardinal(Bmp.Height) - Tmp.GetHeight) div 2);
finally
Graphs.Free;
end;
finally
Matrix.Free;
Tmp.Free;
end;
end;
Hier hat jemand das gleiche Problem in C#, die Antwort hilft mir aber nicht weiter.