procedure ReduceBitmapColors(BMPFile:String);
var
SourceBitmap, TargetBitmap: TFPMemoryImage;
FPMedianCutQuantizer : TFPMedianCutQuantizer;
FPPalette : TFPPalette;
FPFloydSteinbergDitherer:TFPFloydSteinbergDitherer;
ImageReader : TFPReaderBMP;
ImageWriter : TFPWriterBMP;
begin
if FileExists(BMPFile) then begin
SourceBitmap := TFPMemoryImage.Create(0,0);
TargetBitmap := TFPMemoryImage.Create(0,0);
ImageReader := TFPReaderBMP.Create;
ImageWriter := TFPWriterBMP.create;
try
SourceBitmap.LoadFromFile(BMPFile);
FPMedianCutQuantizer := TFPMedianCutQuantizer.Create;
FPMedianCutQuantizer.Add(SourceBitmap);
FPPalette := FPMedianCutQuantizer.Quantize;
FPFloydSteinbergDitherer := TFPFloydSteinbergDitherer.Create(FPPalette);
FPFloydSteinbergDitherer.Dither(SourceBitmap, TargetBitmap);
ImageWriter.BitsPerPixel:=8;
TargetBitmap.SaveToFile(BMPFile, ImageWriter);
finally
SourceBitmap.Free;
TargetBitmap.Free;
FPMedianCutQuantizer.Free;
FPFloydSteinbergDitherer.Free;
ImageReader.Free;
ImageWriter.Free;
end;
end;
end;
..fpimage, FPDitherer, FPQuantizer, FPReadBMP, FPWriteBMP
and to incorporate copy to/from the clipboard you'd could use;procedure ClipboardReduction;
const
TempClipFile:String = 'clipboard.bmp';
var
ClipboardBitmap:TBitmap;
begin
ClipboardBitmap := TBitmap.Create;
try
ClipboardBitmap.LoadFromClipboardFormat(cf_bitmap);
ClipboardBitmap.SaveToFile(TempClipFile);
ReduceBitmapColors(TempClipFile);
ClipboardBitmap.LoadFromFile(TempClipFile);
Clipboard.Assign(ClipboardBitmap);
finally
ClipboardBitmap.Free;
end;
if FileExists(TempClipFile) then DeleteFile(TempClipFile);
end;