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

DelphiX 教學 (22):TDirectDrawSurface.Noise 噪點特效與動態參數控制

     編輯:Delphi

TDirectDrawSurface.Noise 方法可直接在繪圖表面產生隨機噪點圖案,常用於模擬電視訊號干擾、老舊螢幕效果、程序化紋理生成等場景。本文示範如何搭配 TTrackBar 即時調整噪點強度。

函數原型與參數

procedure Noise(const Rect: TRect; Intensity: Integer);
  • Rect:指定產生噪點的矩形區域,通常為 ClientRect 全表面。
  • Intensity:噪點強度 (0-255),數值越大噪點越密集、對比越明顯。

互動式範例程式碼

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DXClass, DXDraws, ComCtrls;

type
  TForm1 = class(TForm)
    DXDraw1: TDXDraw;
    TrackBar1: TTrackBar;
    procedure FormCreate(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  { 設定全螢幕繪圖區域 }
  DXDraw1.Align := alClient;
  
  { 設定軌跡條控制噪點強度 0-255 }
  TrackBar1.Align := alBottom;
  TrackBar1.Height := 22;
  TrackBar1.ShowSelRange := False;
  TrackBar1.Max := 255;
  TrackBar1.Position := 128;  // 預設中等強度
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  { 即時重繪噪點效果 }
  DXDraw1.Surface.Fill(0);  // 清除背景
  DXDraw1.Surface.Lock;     // 必須鎖定才能存取像素
  try
    { 在整個客戶區產生指定強度的噪點 }
    DXDraw1.Surface.Noise(DXDraw1.Surface.ClientRect, TrackBar1.Position);
  finally
    DXDraw1.Surface.UnLock;
  end;
  DXDraw1.Flip;  // 顯示結果
end;

end.

執行效果展示

Noise 效果:拖動軌跡條即時改變噪點密度

進階應用技巧

  1. 動態噪點動畫:在 TDXTimer 中週期性呼叫 Noise 可產生閃爍的靜電干擾動畫。
  2. 局部噪點:指定 Rect 參數可僅在特定區域 (如螢幕邊緣) 產生噪點,模擬鏡頭漏光效果。
  3. 色彩噪點:預設為灰階噪點,若需彩色噪點可先建立調色盤表面再轉換。
  4. 效能考量:全螢幕高解析度即時噪點運算量大,建議在離屏表面預先生成噪點紋理再快速繪製。

常見問題排除

  • 忘記 Lock/UnLock:會導致存取違規或繪製無效。
  • TrackBar 事件頻率過高:可加入簡單節流機制避免過度重繪。
  • 表面格式不支援:確保 DirectDraw 表面建立時支援直接像素存取 (通常預設支援)。

Noise 方法雖然簡單,但結合動態參數控制即可實現豐富的視覺效果,是程序化特效開發的基礎工具之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved