画像の色情報を除去して、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;
|