ソラリゼーション

ソラリゼーションは対象ピクセルの輝度を反転し、対象ピクセルと比較して輝度の低い方を取るフィルタです。

Dest := Min(Source, Source xor $FF);

上の式をRGB各輝度に対して行えばいいわけですが、関数呼び出しはオーバーヘッドが大きいので避けたい所です。if文で判断しても良いのですが、入力・出力共にByteの範囲に収まるので、ここでは変換テーブルを使用します。
ただし、変換テーブルは動的生成とします理由は二つ。一つはユニットが長くなるから。もう一つは改造するときに楽だからです。比較をMinではなくMaxにすることで別の効果を出すことができるので...
静的なテーブルにしたい方はご自分で改造してください(^^;;;

procedure Solarization(Bitmap: TBitmap);
// ソラリゼーション
var
  X, Y: Integer;
  pLine: PLine24;
  Table: array[BYTE]of Byte;
begin
  Bitmap.PixelFormat := pf24bit;
  { 変換テーブルを生成 }
  for X := 0 to 255 do
  begin
    //Table[X] := Min(X, X xor $FF);でも良い
    Y := X xor $FF;
    if X < Y then Y := X;
    Table[X] := Y;
  end;

  { ピクセルの変換処理 }
  for Y := 0 to Bitmap.Height -1 do
  begin
    pLine := Bitmap.ScanLine[Y];
    for X := 0 to Bitmap.Width -1 do
      with pLine^[X] do
      begin
        { 先ほど作った変換テーブルを使用する }
        R := Table[R];
        G := Table[G];
        B := Table[B];
      end;
  end;
  if Assigned(Bitmap.OnChange) then
    Bitmap.OnChange(Bitmap);
end;

Copyright 2001 Rinka Kouzuki All Rights Reserved.