2013-03-23 3 views
1

어떻게 델파이에서 지정된 수 (< = 256)로 색상을 줄일 수 있습니까? 난 그냥 사용하지 않으 :델파이에서 지정된 숫자로 색상을 줄이는 방법은 무엇입니까?

Bmp.PixelFormat := pf8bit; 

때문에 나는 색상의 수를 제어 할 수없는 방법입니다. 256 색 이하의 이미지를 디더하는 법을 이미 알고 있기 때문에 디더링을 원하지 않습니다.

나는이 Median Cut implementation을 발견하지만 순수한 1990 년부터 파스칼과 같습니다

    불필요한
  1. 그것은 쉐어웨어 말한다 및 (어떻게 든) 25 도이치 마크
  2. 외모 비용 델파이로 컴파일되지 않습니다
  3. 복잡한

TBitmap32 (Graphics32 비트 맵 클래스, 32 비트 색상 만 지원)을 < = 8 비트 bmp로 줄이려고합니다. 나는 15/16bit로 줄일 필요가 없으며 24 또는 15/16bit 이미지에서 축소 할 필요가 없습니다. 32 비트 => 8 비트 -

나는 다음을 사용합니다 : 7, 2005, XE3.

+3

그래서 어떤 알고리즘을 사용 하시겠습니까? –

+0

@DavidHeffernan 나는 Median Cut이 멋지다고 생각합니다. 나는 받아 들일만한 결과를 주지만 그것에 대한 어떤 알고리즘 설명도 찾을 수 없었다. Octree 기반의 알고리즘도 있지만 거기에 대한 자세한 설명은 없습니다. – Tom

답변

9

많은 옵션을 가진 구현 속도가 빠르고 저렴한 방법은 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 일 것 쉬운 방법은 gifimg에서 rmQuantize와 ReduceColors을 사용하는 것입니다

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; 

, 픽셀 당 비트 경우 설정해야합니다

// BytesPerPixel integer with range of Range 3 - 8 

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

고맙지 만 16이나 32처럼 원하는 색상 수를 지정할 수 없습니다. – Tom

+0

@Tom 귀하의 요구 사항에 맞는 편집을했습니다. – bummi

+0

좋은 아이디어. 잘 했어. –