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

DelphiX 實戰:TDIB.BlendPixel 像素級 Alpha 混合範例

     編輯:Delphi

TDIB.BlendPixel 在指定座標對單一像素進行 Alpha 混合,可實現噴刷、星塵、粒子特效等精細像素操作。本文提供隨機灑點展示不同 Alpha 值效果的範例。

效果預覽

BlendPixel 效果

核心程式碼

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);
var w, h, i: Integer;
begin
  w := DXPaintBox1.DIB.Width; h := DXPaintBox1.DIB.Height;
  for i := 0 to 9999 do begin
    // 上半部:紅色 Alpha=255(不透明)
    DXPaintBox1.DIB.BlendPixel(Random(w), Random(h div 2), clRed, 255);
    // 下半部:紅色 Alpha=64(約 25% 不透明)
    DXPaintBox1.DIB.BlendPixel(Random(w), Random(h div 2) + (h div 2), clRed, 64);
  end;
  DXPaintBox1.Repaint;
end;
end.

參數說明

BlendPixel(X, Y: Integer; Color: TColor; Alpha: Byte)
  • X, Y:目標像素座標
  • Color:混入顏色
  • Alpha:0~255,0=完全透明(無效果),255=完全不透明(覆蓋)
  • 公式:Result = Src * (Alpha/255) + Dest * (1 - Alpha/255)

效果分析

  • **上半部 (Alpha=255)**:紅色實心噴點,完全覆蓋原圖
  • **下半部 (Alpha=64)**:紅色半透明噴點,與原圖混合呈現淡紅色調
  • 10,000 次隨機點產生類似噴槍/星塵的自然質感

效能考量與優化

  • ❌ **逐像素呼叫極慢**:每次呼叫涉及邊界檢查、色彩空間轉換、函數開銷
  • ✅ **批次優化**:鎖定 DIB 記憶體 (ScanLine),直接操作像素陣列
  • ✅ **SIMD/GPU**:大量粒子系統建議用像素著色器或 Compute Shader
  • 適用場景:低頻率特效(如點擊產生幾十個火花)、原型驗證

進階應用:噴刷工具

procedure SprayBrush(DIB: TDIB; CenterX, CenterY, Radius: Integer; Color: TColor; Density: Single);
var i, dx, dy, dist2: Integer; Alpha: Byte;
begin
  for i := 0 to Round(Density * Radius * Radius) do begin
    dx := Random(Radius*2) - Radius;
    dy := Random(Radius*2) - Radius;
    dist2 := dx*dx + dy*dy;
    if dist2 < Radius*Radius then begin
      Alpha := Round(255 * (1 - Sqrt(dist2) / Radius)); // 中心濃、邊緣淡
      DIB.BlendPixel(CenterX + dx, CenterY + dy, Color, Alpha);
    end;
  end;
end;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved