如何在Delphi中将颜色减少到指定的数字?

Tom*_*Tom 1 delphi colors bitmap quantization reduction

如何在Delphi中将颜色减少到指定的数字(<= 256)?我不想只使用:

 Bmp.PixelFormat := pf8bit;
Run Code Online (Sandbox Code Playgroud)

因为那样我无法控制颜色数量.我不想要抖动,因为我已经知道如何用256或更少颜色抖动图像.

我发现了这个Median Cut实现,但它从1990年开始是纯粹的Pascal,并且:

  1. 不在Delphi中编译
  2. 说它是共享软件并且花费25 Deutche Marks
  3. 看起来(不知何故)不必要的复杂

我想TBitmap32只减少(Graphics32位图类,仅支持32位颜色)到<= 8bit bmp.我不需要减少到15/16bit,我不需要从24或15/16bit图像减少.只需32位=> 8位 -

Delphi我使用:7,2005,XE3.

bum*_*mmi 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;
Run Code Online (Sandbox Code Playgroud)

测试

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;
Run Code Online (Sandbox Code Playgroud)

如果必须设置每像素位数,更简单的方法是使用带有来自gifimg的rmQuantize的ReduceColors

// BytesPerPixel integer with range of Range 3 - 8

DestBMP := ReduceColors(SourceBMP,rmQuantize,dmNearest,BytesPerPixel,0);
Run Code Online (Sandbox Code Playgroud)