如何在Delphi中将颜色减少到指定的数字(< = 256)? 我不想只使用:
Bmp.PixelFormat := pf8bit;
因为这样我无法控制颜色数量。我不想要抖动,因为我已经知道如何用256或更少颜色抖动图像。
我发现了这个Median Cut implementation,但它从1990年起就是纯粹的Pascal,并且:
我想仅将TBitmap32
(Graphics32位图类,仅支持32位颜色)减少到< = 8bit bmp。我不需要减少到15 / 16bit,我不需要从24或15 / 16bit图像减少。只需32位=> 8位 -
Delphi我使用:7,2005,XE3。
答案 0 :(得分:10)
快速实施,廉价的方式有许多选项将是TGIFImage的使用
uses
gifimg;
Procedure ReduceTo8Bit(var bmp:TBitmap; ColorReduction: TColorReduction; DitherMode: TDitherMode);
var
GI:TGifImage;
begin
GI:=TGifImage.Create;
try
GI.DitherMode := DitherMode;
GI.ColorReduction := ColorReduction;
GI.Assign(bmp);
bmp.Assign(GI.Bitmap);
finally
GI.Free;
end;
end;
TEST
procedure TForm3.Button2Click(Sender: TObject);
var
bmp:TBitmap;
begin
bmp:=TBitmap.Create;
try
bmp.LoadFromFile('C:\bilder\bummi.bmp');
ReduceTo8Bit(bmp,rmQuantizeWindows,dmSierra);
bmp.SaveToFile('C:\bilder\bummi_8bit.bmp');
finally
bmp.Free;
end;
end;
如果必须设置每像素位数,则更简单的方法是使用带有来自gifimg的rmQuantize的ReduceColors
// BytesPerPixel integer with range of Range 3 - 8
DestBMP := ReduceColors(SourceBMP,rmQuantize,dmNearest,BytesPerPixel,0);