1

Delphiで指定された数(<= 256)に色を減らすにはどうすればよいですか? 私はただ使いたくない:

 Bmp.PixelFormat := pf8bit;

そうすれば色の数を制御できないからです。256 色以下の画像をディザリングする方法は既に知っているので、ディザリングは必要ありません。

このMedian Cut の実装を見つけましたが、これは 1990 年の純粋な Pascal であり、次のとおりです。

  1. Delphi でコンパイルされない
  2. それはシェアウェアであり、25 ドイツ マルクの費用がかかると言う
  3. 一見(なんとなく)不要で複雑に見える

TBitmap32(Graphics32 ビットマップ クラス、32 ビット カラーのみをサポート) のみ <= 8 ビット bmpに縮小したい。15/16 ビットに縮小する必要はありません。24 または 15/16 ビット イメージから縮小する必要もありません。ちょうど 32bit => 8bit-

私が使用する Delphi: 7、2005、XE3。

4

1 に答える 1

11

多くのオプションを備えた迅速に実装された安価な方法は、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 の rmQuantize で ReduceColors を使用することです。

// BytesPerPixel integer with range of Range 3 - 8

DestBMP := ReduceColors(SourceBMP,rmQuantize,dmNearest,BytesPerPixel,0);
于 2013-03-23T16:11:13.033 に答える