首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

再學GDI+[56]: 路徑扭曲變形 - Warp 方法實現透視與雙線性扭曲

     編輯:Delphi

前言

TGPGraphicsPath.Warp 允許將路徑從原始矩形區域扭曲映射到任意四邊形(或三角形自動補全為平行四邊形)。這是實現透視變換、旗幟飄動、紋理映射等效果的核心方法。

Warp 參數完整解析

procedure Warp(destPoints: PGPPointF; count: Integer; srcRect: TGPRectF;
  matrix: TGPMatrix = nil; warpMode: TWarpMode = WarpModePerspective; flatness: Single = 0.25);
參數說明
destPoints目標區域 3 或 4 個頂點(順序:左上、右上、左下、右下)
count3 或 4(3 點時自動推算第 4 點形成平行四邊形)
srcRect源路徑外接矩形(通常用 path.GetBounds 取得)
matrix額外矩陣變換(可選)
warpModeWarpModePerspective(透視,預設)或 WarpModeBilinear(雙線性)
flatness曲線平坦化精度

滑鼠拖曳四頂點互動範例

  • 預設 4 個控制點對應矩形四角
  • CheckBox 切換 3/4 點模式
  • 滑鼠拖曳控制點即時更新扭曲效果
  • 路徑包含橢圓 + 文字 "Delphi"

核心實作片段

procedure TForm1.FormPaint(Sender: TObject);
var
  g: TGPGraphics;
  p: TGPPen;
  b: TGPBrush;
  path: TGPGraphicsPath;
  fontFamily: TGPFontFamily;
  StringFormat: TGPStringFormat;
  rectf: TGPRectF;
  i: Integer;
begin
  g := TGPGraphics.Create(Canvas.Handle);
  p := TGPPen.Create(aclRed, 1);
  b := TGPHatchBrush.Create(HatchStyleShingle, aclDarkCyan);
  path := TGPGraphicsPath.Create;
  path.AddEllipse(MakeRect(R));
  fontFamily := TGPFontFamily.Create('Arial Black');
  StringFormat := TGPStringFormat.Create;
  StringFormat.SetAlignment(StringAlignmentCenter);
  StringFormat.SetLineAlignment(StringAlignmentCenter);
  path.GetBounds(rectf);
  path.AddString('Delphi', -1, fontFamily, FontStyleRegular, 48, rectf, StringFormat);
  
  {關鍵:Warp 扭曲}
  path.Warp(PGPPointF(@ptfs), Length(ptfs), rectf);
  
  g.FillPath(b, path);
  for i := 0 to ptCount - 1 do
    g.DrawRectangle(p, MakeRect(ptfs[i].X-3, ptfs[i].Y-3, 6, 6));
  
  StringFormat.Free; fontFamily.Free; path.Free; b.Free; p.Free; g.Free;
end;

執行效果預覽

Warp 透視扭曲效果

透視 vs 雙線性模式差異

  • WarpModePerspective:真實 3D 透視效果,遠小近大,直線保持直線
  • WarpModeBilinear:雙線性插值,類似紋理映射,邊緣可能彎曲

進階應用技巧

  • 旗幟飄動:定時器正弦波動控制頂點 Y 座標
  • 書本翻頁:中間折線控制點動畫
  • 投影校正:投影儀梯形校正反向運算
  • UI 轉場:卡片翻轉、頁面捲曲動畫

表單定義檔

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 220
  ClientWidth = 264
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnCreate = FormCreate
  OnMouseDown = FormMouseDown
  OnMouseMove = FormMouseMove
  OnMouseUp = FormMouseUp
  OnPaint = FormPaint
  PixelsPerInch = 96
  TextHeight = 13
  object CheckBox1: TCheckBox ... {3/4 點模式切換}
end
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved