TDIB.DoSmoothRotate 以雙線性/雙三次插值實現任意角度的高品質影像旋轉,避免最近鄰插值的鋸齒與像素遺失。本文提供累加角度旋轉動畫範例。

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; // 旋轉 22.5°
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;
var Form1: TForm1;
implementation {$R *.dfm}
var dib: TDIB; Angle: Double;
procedure TForm1.FormCreate(Sender: TObject);
begin dib := TDIB.Create; end;
procedure TForm1.FormDestroy(Sender: TObject); begin dib.Free; end;
procedure TForm1.Button1Click(Sender: TObject);
const ImgPath1 = 'C:\Temp\DX.jpg';
begin
dib.LoadFromFile(ImgPath1);
DXPaintBox1.DIB.Assign(dib);
DXPaintBox1.Width := dib.Width;
DXPaintBox1.Height := dib.Height;
Angle := 0;
DXPaintBox1.Repaint;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
DXPaintBox1.DIB.Fill(0); // 黑底
Angle := Angle + 22.5;
// DoSmoothRotate(SrcDIB, CenterX, CenterY, AngleDeg)
DXPaintBox1.DIB.DoSmoothRotate(dib, dib.Width div 2, dib.Height div 2, Angle);
DXPaintBox1.Repaint;
end;
end.
DoSmoothRotate(SrcDIB: TDIB; CenterX, CenterY: Integer; AngleDeg: Double)
❌ **錯誤做法**:
DIB.DoSmoothRotate(DIB, ...)自己旋轉自己 → 每次累積插值誤差,幾幀後模糊不堪
✅ **正確做法**:DIB.DoSmoothRotate(OriginalDIB, ...)永遠從原圖旋轉 → 品質恆定
var RotatedFrames: array[0..359] of TDIB;
procedure PrecomputeRotations(Source: TDIB);
var i: Integer;
begin
for i := 0 to 359 do begin
RotatedFrames[i] := TDIB.Create;
RotatedFrames[i].SetSize(Source.Width, Source.Height, 24);
RotatedFrames[i].Fill(0);
RotatedFrames[i].DoSmoothRotate(Source, Source.Width div 2, Source.Height div 2, i);
end;
end;
// 執行期:DXPaintBox1.DIB.Assign(RotatedFrames[Round(Angle) mod 360]);