PlgBlt transzformáció

Top  Previous  Next

Egy képet tetszőleges paralelogrammába másol.

 

       Image1                                                        PaintBox1

 

plgblt

 

procedure TForm1.Button1Click(Sender: TObject);

var paral: array[0..2] of TPOINT;

begin

  paral[0] := Point(0,100);

  paral[1] := Point(200,0);

  paral[2] := Point(400,400);

  PlgBlt(PaintBox1.Canvas.Handle,paral,Image1.Picture.Bitmap.Canvas.Handle,

         0,0,Image1.width,Image1.Height,0,0,0);

end;

 

A paral tömbben a paralelogramma 2 felső és a bal alsó sarkát kell megadni: a jobb alsó csúcsot számolja a PlgBlt.

 

KÉPFORGATÁSA PLGBLT SEGÍTSÉGÉVEL

 

plgblt_forg

 

Nagy nagyításoknál, vészesen elfogyasztja a memóriát, olyannyira, hogy a gép lefagy.

Ezért érdemes lenne a forgatás centruma körüli olyan téglalapot választani, melynek nagyított képe a forgás sorám biztosan a képernyőre jut. Ez a méret a téglalap átlója lenne, abban az esetben ha a kép nagyobb lesz a képernyőre jutó ablaknál.

 

 

unit plgblt1;

 

interface

 

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ExtCtrls, jpeg, Math, NewGeom, ComCtrls;

 

type

TForm1 = class(TForm)

   PaintBox1: TPaintBox;

   Panel1: TPanel;

   Image1: TImage;

   Button1: TButton;

   Timer1: TTimer;

   Label1: TLabel;

   Button2: TButton;

   Button3: TButton;

   TrackBar1: TTrackBar;

   TrackBar2: TTrackBar;

   Label2: TLabel;

   procedure Button1Click(Sender: TObject);

   procedure FormCreate(Sender: TObject);

   procedure Button2Click(Sender: TObject);

   procedure Button3Click(Sender: TObject);

   procedure Timer1Timer(Sender: TObject);

   procedure TrackBar1Change(Sender: TObject);

   procedure TrackBar2Change(Sender: TObject);

private

   { Private declarations }

public

   oCent : TPoint2d;

   ta,tb : double;

   rSzog : double;

   keret : TTeglalap;

   paral: array[0..2] of TPOINT;

   Size: TPoint;

end;

 

var

Form1: TForm1;

 

{ Téglalap elforgatása Cent-rum körül: w,h : szélesség,hosszúság}

function RotateRect2d(Cent: TPoint2d; w,h : double; Angle: double): TTeglalap;

procedure DrawTegla(Ca: TCanvas; t: TTeglalap);

 

implementation

 

{$R *.DFM}

 

procedure TForm1.FormCreate(Sender: TObject);

begin

Size:=Point(Image1.Picture.Bitmap.width,Image1.Picture.Bitmap.Height);

oCent := Point2d(300,300);

ta := Size.x; tb := Size.y;

rSzog := 0;

end;

 

procedure DrawTegla(Ca: TCanvas; t: TTeglalap);

begin

Ca.MoveTo(Round(t.a.x),Round(t.a.y));

Ca.LineTo(Round(t.b.x),Round(t.b.y));

Ca.LineTo(Round(t.c.x),Round(t.c.y));

Ca.LineTo(Round(t.d.x),Round(t.d.y));

Ca.LineTo(Round(t.a.x),Round(t.a.y));

end;

 

function RotateRect2d(Cent: TPoint2d; w,h : double; Angle: double): TTeglalap;

begin

with Result do begin

a:=Point2d(Cent.x-w/2,Cent.y+h/2);

RelRotate2d(a,Cent,Angle);

b:=Point2d(Cent.x+w/2,Cent.y+h/2);

RelRotate2d(b,Cent,Angle);

c:=Point2d(Cent.x+w/2,Cent.y-h/2);

RelRotate2d(c,Cent,Angle);

d:=Point2d(Cent.x-w/2,Cent.y-h/2);

RelRotate2d(d,Cent,Angle);

end;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  paral[0] := Point(0,100);

  paral[1] := Point(200,0);

  paral[2] := Point(80,200);

  PlgBlt(PaintBox1.Canvas.Handle,paral,Image1.Picture.Bitmap.Canvas.Handle,

         0,0,Size.x,Size.y,0,0,0);

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

Timer1.Enabled:=True;

end;

 

procedure TForm1.Button3Click(Sender: TObject);

begin

Timer1.Enabled:=False;

end;

 

procedure TForm1.Timer1Timer(Sender: TObject);

begin

  keret := RotateRect2d(oCent,ta,tb,rSzog);

  rSzog := rSzog + 0.1;

  paral[0] := Point(Round(keret.a.x),Round(keret.a.y));

  paral[1] := Point(Round(keret.b.x),Round(keret.b.y));

  paral[2] := Point(Round(keret.d.x),Round(keret.d.y));

  PlgBlt(PaintBox1.Canvas.Handle,paral,Image1.Picture.Bitmap.Canvas.Handle,

         0,0,Size.x,Size.y,0,0,0);

  DrawTegla(PaintBox1.Canvas,keret);

end;

 

procedure TForm1.TrackBar1Change(Sender: TObject);

var z: double;

begin

z :=  TrackBar1.Position/100;

ta := size.x*z;

tb := size.y*z;

end;

 

procedure TForm1.TrackBar2Change(Sender: TObject);

begin

  rSzog := DegToRad(TrackBar2.Position);

  keret := RotateRect2d(oCent,ta,tb,rSzog);

  paral[0] := Point(Round(keret.a.x),Round(keret.a.y));

  paral[1] := Point(Round(keret.b.x),Round(keret.b.y));

  paral[2] := Point(Round(keret.d.x),Round(keret.d.y));

  PlgBlt(PaintBox1.Canvas.Handle,paral,Image1.Picture.Bitmap.Canvas.Handle,

         0,0,Size.x,Size.y,0,0,0);

end;

 

end.