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

DelphiX 實戰:TDIB.AntialiasedLine 反鋸齒線條繪製範例

     編輯:Delphi

TDIB.AntialiasedLine 使用 Wu 反鋸齒演算法繪製平滑邊緣的直線,有效消除鋸齒狀階梯效果,適合高品質向量繪圖、UI 邊框、圖表繪製。本文提供對角線交叉對比範例。

效果預覽

AntialiasedLine 效果

核心程式碼

unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DIB, StdCtrls;
type
  TForm1 = class(TForm)
    DXPaintBox1: TDXPaintBox;
    procedure FormCreate(Sender: TObject);
  end;
var Form1: TForm1;
implementation {$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
const ImgPath1 = 'C:\Temp\DX.jpg';
begin
  DXPaintBox1.DIB.LoadFromFile(ImgPath1);
  DXPaintBox1.Width := DXPaintBox1.DIB.Width;
  DXPaintBox1.Height := DXPaintBox1.DIB.Height;
  // AntialiasedLine(X1, Y1, X2, Y2, Color)
  DXPaintBox1.DIB.AntialiasedLine(0, 0, DXPaintBox1.Width, DXPaintBox1.Height, clRed);
  DXPaintBox1.DIB.AntialiasedLine(0, DXPaintBox1.Height, DXPaintBox1.Width, 0, clRed);
end;
end.

參數說明

AntialiasedLine(X1, Y1, X2, Y2: Integer; Color: TColor)
  • 標準線段參數,內部使用 Xiaolin Wu 演算法
  • 自動計算子像素覆蓋率,在邊緣像素應用部分透明度
  • 無額外參數控制(如線寬固定為 1 像素等效)

視覺差異對比

特性Canvas.LineTo (GDI)TDIB.AntialiasedLine
邊緣品質鋸齒明顯平滑過渡
線寬控制支援任意寬度固定 1px 等效
效能硬體加速快CPU 計算較慢
透明度支援需額外設定內建 Alpha 混合

應用場景

  • **向量圖形編輯器**:高品質線條繪製
  • **科學圖表**:坐標軸、曲線、網格線
  • **UI 渲染**:按鈕邊框、分隔線、圖示輪廓
  • **字型渲染**:筆畫骨架繪製(需配合填充)

效能優化建議

  • 大量線條時,預先計算像素覆蓋率查表
  • 可接受輕微鋸齒時,改用 Canvas.LineTo + 多重採樣
  • 現代專案建議改用 Direct2D / Skia 等 GPU 加速 2D 庫

進階:任意線寬反鋸齒

若需粗反鋸齒線,可繪製多條平行反鋸齒線並疊加:

procedure ThickAALine(DIB: TDIB; X1, Y1, X2, Y2: Integer; Width: Integer; Color: TColor);
var dx, dy, len, nx, ny, i: Real;
begin
  dx := X2 - X1; dy := Y2 - Y1;
  len := Sqrt(dx*dx + dy*dy);
  if len = 0 then Exit;
  nx := -dy / len * (Width - 1) / 2; // 法向量
  ny := dx / len * (Width - 1) / 2;
  for i := -(Width - 1) / 2 to (Width - 1) / 2 do
    DIB.AntialiasedLine(Round(X1 + nx * i), Round(Y1 + ny * i),
                        Round(X2 + nx * i), Round(Y2 + ny * i), Color);
end;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved