TDIB.Distort 以指定中心點、角度與強度對影像進行旋轉扭曲變形,可產生漩渦、水波、熱氣擾動等特效。本文提供按鈕觸發單次扭曲的範例。

unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DIB, StdCtrls;
type
TForm1 = class(TForm)
DXPaintBox1: TDXPaintBox;
Button1: TButton; // 載入圖片
Button2: TButton; // 執行扭曲
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;
var Form1: TForm1;
implementation {$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
const ImgPath1 = 'C:\Temp\DX.jpg';
begin
DXPaintBox1.DIB.LoadFromFile(ImgPath1);
DXPaintBox1.Width := DXPaintBox1.DIB.Width;
DXPaintBox1.Height := DXPaintBox1.DIB.Height;
DXPaintBox1.Repaint;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
// Distort(SrcDIB, Mode, CenterX, CenterY, AngleDeg, Strength)
DXPaintBox1.DIB.Distort(DXPaintBox1.DIB,
dtFast, // 模式:快速/品質
DXPaintBox1.Width div 2, // 中心 X
DXPaintBox1.Height div 2, // 中心 Y
90, // 扭曲角度(度)
6.5); // 強度
DXPaintBox1.Repaint;
end;
end.
Distort(SrcDIB: TDIB; Mode: TDistortType; CX, CY: Integer; Angle: Real; Strength: Real)
dtFast(雙線性插值、快)或 dtQuality(雙三次插值、慢但品質好)var Angle: Real = 0; Strength: Real = 0;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
DXPaintBox1.DIB.Assign(OriginalDIB);
Angle := Angle + 5; if Angle >= 360 then Angle := 0;
Strength := 6.5 * Sin(Angle * Pi / 180); // 0~6.5 週期性變化
DXPaintBox1.DIB.Distort(OriginalDIB, dtFast, CX, CY, Angle, Strength);
DXPaintBox1.Repaint;
end;
dtFast 適合即時動畫,dtQuality 適合靜態高品質輸出