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

DelphiX 實戰:TDIB.Distort 影像扭曲變形範例

     編輯:Delphi

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

效果預覽

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)
  • Mode:dtFast(雙線性插值、快)或 dtQuality(雙三次插值、慢但品質好)
  • CX, CY:扭曲中心點座標
  • Angle:旋轉角度(度),正值逆時針
  • Strength:扭曲強度,越大扭曲越劇烈(範例 6.5 為中等)

效果分析

  • 以畫面中心為軸,像素按距離中心遠近旋轉不同角度
  • 中心附近旋轉角度大,邊緣漸變小,形成漩渦狀扭曲
  • Strength 控制角度隨半徑的變化率

應用場景

  • **魔法傳送門/漩渦**:持續動畫 Angle 產生旋轉漩渦
  • **水面倒影擾動**:小 Strength + 隨機 Angle 變化
  • **熱氣擾動/折射**:動態 Strength 模擬空氣折射
  • **場景轉場特效**:畫面扭曲收縮/展開
  • **角色狀態異常**:眩暈、中毒時畫面扭曲

動畫化實作

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 適合靜態高品質輸出
  • 大圖建議先縮小處理再放大,或使用 GPU 着色器實現
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved