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