unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, GR32, GR32_Image, GR32_Transforms, GR32_Layers, StdCtrls,
Buttons, ExtDlgs;
type
TForm1 =
class(TForm)
Src: TImage32;
Dst: TImage32;
Dst2: TImage32;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Uses JPeg;
procedure TForm1.FormCreate(Sender: TObject);
begin
// Bitmap laden
Src.Bitmap.LoadFromFile('
SinCos-Mini.bmp');
Dst.SetupBitmap;
Dst2.SetupBitmap;
end;
{
Im ersten Beispiel wird eine rechteckige Bitmap in ein Trapez verformt
}
procedure TForm1.Button1Click(Sender: TObject);
Var
// Objekt für die Transformation
PT: TProjectiveTransformation;
begin
// Objekt für projektive Transformation erzeugen
PT:=TProjectiveTransformation.Create;
// Erstmal 4 Punkte definieren für das vierseitige konvexe Ziel-Polygon
// Reihenfolge Oben/Linke, Oben/Rechts, Unten/Rechts, Unten/Links
PT.X0:=30;
PT.Y0:=0;
PT.X1:=Src.Bitmap.Width-30;
PT.Y1:=0;
PT.X2:=Src.Bitmap.Width;
PT.Y2:=Src.Bitmap.Height;
PT.X3:=0;
PT.Y3:=Src.Bitmap.Height;
// Wichtig: Man muss in TProjectiveTransformation die Grösse
// des Quell-Rechtecks definieren!
PT.SrcRect:=FloatRect(0,0,Src.Bitmap.Width-1,Src.Bitmap.Height-1);
Dst.BeginUpdate;
// Gesamtes Bitmap mit transparenter Farbe löschen
Dst.Bitmap.Clear(0);
// Verformen
Transform(Dst.Bitmap,Src.Bitmap,PT);
Dst.EndUpdate;
// und Anzeigen
Dst.Invalidate;
// Transformobjekt freigeben
PT.Free;
Button1.Enabled:=false;
Button2.Enabled:=true;
end;
{
Im zweiten Beispiel wird das Trapez "von Hand", also Punkt für Punkt, wieder
in ein Rechteck verformt
}
procedure TForm1.Button2Click(Sender: TObject);
Var
X,Y: Integer;
P: TFixedPoint;
// Objekt für die Transformation
PT: TProjectiveTransformation;
begin
// Objekt für projektive Transformation erzeugen
PT:=TProjectiveTransformation.Create;
// Erstmal 4 Punkte definieren für das vierseitige konvexe Quell-Polygon
// Reihenfolge Oben/Linke, Oben/Rechts, Unten/Rechts, Unten/Links
PT.X0:=30;
PT.Y0:=0;
PT.X1:=Src.Bitmap.Width-30;
PT.Y1:=0;
PT.X2:=Src.Bitmap.Width;
PT.Y2:=Src.Bitmap.Height;
PT.X3:=0;
PT.Y3:=Src.Bitmap.Height;
// Wichtig: Man muss in TProjectiveTransformation die Grösse
// des Ziel-Rechtecks definieren!
PT.SrcRect:=FloatRect(0,0,Src.Bitmap.Width-1,Src.Bitmap.Height-1);
Dst2.BeginUpdate;
// Gesamtes Bitmap mit transparenter Farbe löschen
Dst2.Bitmap.Clear(0);
For X:=0
to Src.Bitmap.Width-1
do Begin
For Y:=0
to Src.Bitmap.Height-1
do Begin
// Punkt Koordinaten umrechnen
P:=PT.Transform(FixedPoint(X,Y));
// Zugehörigen Pixel von Quelle nach Ziel übertragen
Dst2.Bitmap.Pixel[X,Y]:=Dst.Bitmap.PixelXS[P.X,P.Y];
End;
End;
Dst2.EndUpdate;
// und Anzeigen
Dst2.Invalidate;
// Transformobjekt freigeben
PT.Free;
Button2.Enabled:=false;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Dst.Bitmap.Clear(0);
Dst2.Bitmap.Clear(0);
Button1.Enabled:=true;
end;
end.