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

DelphiX 實戰:TDIB.Negative 負片效果與色深影響

     編輯:Delphi

TDIB.Negative 產生影像負片效果(色彩反相),但在高色深(>8-bit)下存在已知問題。本文提供四種色深下的對比測試範例。

效果預覽

Negative 效果

核心程式碼

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; // 8-bit 負片
    Button3: TButton; // 4-bit 負片
    Button4: TButton; // 1-bit 負片
    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); // 8-bit
begin
  DXPaintBox1.DIB.BitCount := 8;
  DXPaintBox1.DIB.Negative;
  DXPaintBox1.Repaint;
end;

procedure TForm1.Button3Click(Sender: TObject); // 4-bit
begin
  DXPaintBox1.DIB.BitCount := 4;
  DXPaintBox1.DIB.Negative;
  DXPaintBox1.Repaint;
end;

procedure TForm1.Button4Click(Sender: TObject); // 1-bit
begin
  DXPaintBox1.DIB.BitCount := 1;
  DXPaintBox1.DIB.Negative;
  DXPaintBox1.Repaint;
end;
end.

色深與 Negative 行為差異

原理與問題分析

  • 8-bit 以下:使用調色盤,Negative 修改調色盤索引映射(索引 i → 255-i),極快且正確
  • 高色深:直接操作 RGB 數值(255-R, 255-G, 255-B),但 DelphiX 實作可能未正確處理 Alpha 通道或色彩空間,導致異常
  • **解決方案**:高色深影像先轉 8-bit 執行 Negative,再轉回高色深

正確的高色深負片實作


procedure TrueColorNegative(DIB: TDIB);
var x, y: Integer; c: TRGBQuad;
begin
  for y := 0 to DIB.Height - 1 do
    for x := 0 to DIB.Width - 1 do begin
      c := DIB.Pixels[x, y];
      c.rgbRed := 255 - c.rgbRed;
      c.rgbGreen := 255 - c.rgbGreen;
      c.rgbBlue := 255 - c.rgbBlue;
      // 保留 Alpha:c.rgbReserved 不變
      DIB.Pixels[x, y] := c;
    end;
end;

應用場景

  • **負片掃描還原**:數位化底片轉正片
  • **特效/視覺風格**:恐怖、超自然、記憶片段
  • **無障礙/高對比度模式**:輔助視力障礙使用者
  • **圖像處理前置**:某些演算法需負片輸入
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
BitCount色彩數Negative 效果說明
24/3216M/4G**有問題**直接反相可能產生錯誤色彩,非預期結果
8256正常調色盤索引反相,效果正確
416正常16 色調色盤反相
12正常黑白互換