古ぼけた写真のような色合いにするセピアフィルタを作ってみましょう。なお、元ネタは たき さんのホームページ「たき厩舎」にあったのですが、サイトのリニューアルと共になくなってしまいました。
ここで各サンプルコードは元ネタをより高速に動作するようにしたものです。ちなみに、どういった原理でセピアカラーに変化するのはまったく知らないので、アルゴリズムについての解説はできません(爆)
なので、このコードで動かすとセピアカラーになるんだ!と割り切りましょう(^^;
procedure Sepia(Bitmap: TBitmap);
var
X, Y, I: Integer;
RTable, BTable: TByteTable;
pLine: PLine24;
begin
{ 変換テーブルを作成 }
for I := 0 to 255 do
begin
X := Round(Power(I / 255, 0.75) * 255);
Y := Round(Power(I / 255, 1.33) * 255);
if X > 255 then X := 255 else if X < 0 then X := 0;
if Y > 255 then Y := 255 else if Y < 0 then Y := 0;
RTable[I] := X;
BTable[I] := 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
I := (R * 77 + G * 150 + B * 29 + 128) div 256;
if I > 255 then I := 255 else if I < 0 then I := 0;
R := RTable[I];
G := I;
B := BTable[I];
end;
end;
if Assigned(Bitmap.OnChange) then
Bitmap.OnChange(Bitmap);
end;
|