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

DelphiX 實戰:TDIB.DoSolorize 曝光過度/太陽化效果

     編輯:Delphi

TDIB.DoSolorize 模擬菲林曝光過度產生的太陽化效果(Solarization):亮部色彩反相,暗部保持,形成詭異的高對比度藝術效果。本文提供單一參數測試範例。

效果預覽

DoSolorize 效果

核心程式碼

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);
begin
  // DoSolorize(Threshold: Integer)  // 閾值控制反相起始點
  DXPaintBox1.DIB.DoSolorize(1);
  DXPaintBox1.Repaint;
end;
end.

參數與效果

  • Threshold (Integer):閾值,控制從何亮度開始反相
  • 值越小 → 更多區域反相(範例 1 幾乎全反相)
  • 值越大 → 僅極亮區域反相
  • 典型範圍 0~128,128 以上效果不明顯

太陽化原理

  1. 計算灰階/亮度
  2. 亮度 > Threshold 的像素:各通道反相 255 - Value
  3. 亮度 ≤ Threshold:保持原色
  4. 形成「暗部正常、亮部負片」的強烈對比

歷史背景

源自傳統暗房技術:顯影過程中再次曝光,導致銀鹵化物再次感光並反相。曼·雷、李·米勒等超現實主義攝影師常用此技法創造夢境感。

應用場景

  • **藝術攝影後製**:超現實、夢境、詭異氛圍
  • **遊戲特效**:異世界、腐化、魔法污染視覺表現
  • **UI 強調**:關鍵資訊太陽化突顯
  • **資料視覺化**:極值區域反相警示

進階:可控曲線太陽化


procedure CurveSolarize(DIB: TDIB; Curve: array of Byte); // Curve[0..255] 輸出映射
var x, y: Integer; c: TRGBQuad; gray: Byte;
begin
  for y := 0 to DIB.Height - 1 do
    for x := 0 to DIB.Width - 1 do begin
      c := DIB.Pixels[x, y];
      gray := Round(0.299*c.rgbRed + 0.587*c.rgbGreen + 0.114*c.rgbBlue);
      var mapped := Curve[gray];
      // 保持色相,僅調整亮度
      if gray > 0 then begin
        c.rgbRed := Round(c.rgbRed * mapped / gray);
        c.rgbGreen := Round(c.rgbGreen * mapped / gray);
        c.rgbBlue := Round(c.rgbBlue * mapped / gray);
      end;
      DIB.Pixels[x, y] := c;
    end;
end;
// 用法:建立 S 型曲線陣列,精確控制反相過渡
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved