gpt4 book ai didi

delphi - Delphi中如何将颜色减少到指定数量?

转载 作者:行者123 更新时间:2023-12-02 02:34:03 28 4
gpt4 key购买 nike

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

 Bmp.PixelFormat := pf8bit;

因为这样我就无法控制颜色的数量。我不想抖动,因为我已经知道如何对 256 种或更少颜色的图像进行抖动。

我找到了这个Median Cut implementation但它是 1990 年的纯 Pascal,并且:

  1. 无法在 Delphi 中编译
  2. 声称它是共享软件,售价 25 德国马克
  3. 看起来(不知何故)不必要的复杂

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

我使用的Delphi:2005年7月,XE3。

最佳答案

使用 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;

测试

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的ReduceColors和rmQuantize

// BytesPerPixel integer with range of Range 3 - 8

DestBMP := ReduceColors(SourceBMP,rmQuantize,dmNearest,BytesPerPixel,0);

关于delphi - Delphi中如何将颜色减少到指定数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15588515/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com