グレイスケール化

画像の色情報を除去して、256階調にグレイスケール化を行います。私はRGBの各輝度を単純に加算して3で割ればいいのだと思っていましたが、どうやら違うようです。NiftyのFDELPHIフォーラムの会議室にちゃんとした演算方法がかかれていたので、その式を使って作成したのが以下の関数です。

procedure Grayscale(Bitmap: TBitmap);
var
  X, Y, Gray: Integer;
  pLine: PLine24;
begin
  Bitmap.PixelFormat := pf24bit;
  { ピクセルの変換処理 }
  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
        Gray := Round((R * 30 + G * 59 + B * 11) / 100);
        { 0..255の範囲に飽和(もしかすると必要ないかも(^^;) }
        if Gray > 255 then Gray := 255
        else if Gray < 0 then Gray := 0;
        R := Gray;
        G := Gray;
        B := Gray;
      end;
  end;
  if Assigned(Bitmap.OnChange) then
    Bitmap.OnChange(Bitmap);
end;

Copyright 2001 Rinka Kouzuki All Rights Reserved.