セピア

古ぼけた写真のような色合いにするセピアフィルタを作ってみましょう。なお、元ネタは たき さんのホームページ「たき厩舎」にあったのですが、サイトのリニューアルと共になくなってしまいました。
ここで各サンプルコードは元ネタをより高速に動作するようにしたものです。ちなみに、どういった原理でセピアカラーに変化するのはまったく知らないので、アルゴリズムについての解説はできません(爆)
なので、このコードで動かすとセピアカラーになるんだ!と割り切りましょう(^^;

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;


Copyright 2001 Rinka Kouzuki All Rights Reserved.