
g.DrawImage(img, PGPPoint(@pts), 3) 接受 3 個點陣列定義仿射變換:
pts[0] → 圖片右上角映射位置pts[1] → 圖片左上角映射位置pts[2] → 圖片右下角映射位置拖曳任一控制點即時更新陣列並重繪,實現透視/扭曲效果。
procedure TForm1.FormCreate(...);
begin ... // 初始化三點形成矩形
pts[0] := MakePoint(cx+w, cy); // 右上
pts[1] := MakePoint(cx, cy); // 左上
pts[2] := MakePoint(cx+w, cy+h); // 右下
DoubleBuffered := True; end;
procedure TForm1.FormMouseDown(...);
var i: Integer; begin flag := -1;
for i := 0 to 2 do if PtInRect(Bounds(pts[i].X-3, pts[i].Y-3, 6, 6), Point(X,Y)) then begin flag:=i; Exit; end; end;
procedure TForm1.FormMouseMove(...);
begin if flag = -1 then Exit; pts[flag] := MakePoint(X, Y); Repaint; end;
procedure TForm1.FormPaint(...);
var g: TGPGraphics; p: TGPPen; i: Integer;
begin g := TGPGraphics.Create(Self.Canvas.Handle); p := TGPPen.Create(aclRed);
g.DrawImage(img, PGPPoint(@pts), 3); // 核心:3點仿射
for i := 0 to 2 do g.DrawRectangle(p, pts[i].X-3, pts[i].Y-3, 6, 6); // 控制點
p.Free; g.Free; end;