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

DelphiX 實戰:TDIB.Mirror 鏡像翻轉效果

     編輯:Delphi

TDIB.Mirror 提供水平、垂直、雙向鏡像翻轉,本文提供四種翻轉模式的完整對比範例。

效果預覽

Mirror 效果

核心程式碼

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; // 水平鏡像
    Button3: TButton; // 垂直鏡像
    Button4: TButton; // 雙向鏡像
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(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
  // Mirror(Horizontal, Vertical: Boolean)
  DXPaintBox1.DIB.Mirror(True, False);
  DXPaintBox1.Repaint;
end;

procedure TForm1.Button3Click(Sender: TObject); // 垂直
begin
  DXPaintBox1.DIB.Mirror(False, True);
  DXPaintBox1.Repaint;
end;

procedure TForm1.Button4Click(Sender: TObject); // 雙向
begin
  DXPaintBox1.DIB.Mirror(True, True);
  DXPaintBox1.Repaint;
end;
end.

參數對照

HorizontalVertical效果座標變換
TrueFalse左右鏡像X' = Width - 1 - X
FalseTrue上下翻轉Y' = Height - 1 - Y
TrueTrue180° 旋轉X', Y' 皆翻轉
FalseFalse無變化恆等

應用場景

  • **角色面向切換**:2D 遊戲左/右移動共用同一素材
  • **水面倒影**:垂直鏡像 + 漸變透明 + 擾動
  • **鏡子/玻璃反射**:水平鏡像 + 半透明
  • **UI 圖示變體**:單一素材生成左右/上下/旋轉四種
  • **材質無縫拼貼**:邊緣鏡像消除縫隙

效能與記憶體

  • 就地修改,無額外記憶體分配
  • 時間複雜度 O(N),N=像素數,極快
  • 可離線預處理素材表,執行期直接使用

進階:任意軸鏡像


procedure MirrorAxis(DIB: TDIB; CenterX, CenterY: Integer; AngleDeg: Real);
var x, y, nx, ny: Integer; c: TRGBQuad; cosA, sinA: Double;
begin
  cosA := Cos(AngleDeg * Pi / 180); sinA := Sin(AngleDeg * Pi / 180);
  // 需建立副本避免覆蓋未讀像素
  var Backup := TDIB.Create; Backup.Assign(DIB);
  for y := 0 to DIB.Height - 1 do
    for x := 0 to DIB.Width - 1 do begin
      // 平移到原點 -> 旋轉 2*Angle -> 平移回
      nx := Round((x - CenterX) * cosA * 2 - (y - CenterY) * sinA * 2 + CenterX);
      ny := Round((x - CenterX) * sinA * 2 + (y - CenterY) * cosA * 2 + CenterY);
      if (nx >= 0) and (nx < DIB.Width) and (ny >= 0) and (ny < DIB.Height) then
        DIB.Pixels[x, y] := Backup.Pixels[nx, ny];
    end;
  Backup.Free;
end;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved