type PRGB32Array = ^TRGB32Array; TRGB32Array = packed array[0..MaxInt div SizeOf(TRGBQuad)-1] of TRGBQuad; procedure MakeGrey(Bitmap: TBitmap); var w, h: integer; y: Integer; sl: PRGB32Array; x: Integer; grey: byte; begin Bitmap.PixelFormat := pf32bit; w := Bitmap.Width; h := Bitmap.Height; for y := 0 to h - 1 do begin sl := Bitmap.ScanLine[y]; for x := 0 to w - 1 do with sl[x] do begin grey := (rgbBlue + rgbGreen + rgbRed) div 3; rgbBlue := grey; rgbGreen := grey; rgbRed := grey; end; end; end; // Sample usage: procedure TForm4.Button1Click(Sender: TObject); var bm: TBitmap; begin bm := TBitmap.Create; try bm.LoadFromFile('C:\gambar\foto.bmp'); MakeGrey(bm); Canvas.Draw(0, 0, bm); finally bm.Free; end; end;