2016-05-24 1 views
1

J'utilise IMAGEEN 5.2 (DCU Version) dans Delphi XE 10.Comment supprimer couleur inutilisée de la palette dans ImgeEN

Je veux supprimer les couleurs du tableau Couleur UNUSED (ou même palette) et utiliser ce code mais ne fonctionnent pas :(

procedure ConvertToOrdinal_8bit(PathToSave: string); 
     var 
     UsedColors: Integer; 
     RGB_Palette: array of TRGB; 
    begin 
     with ImageEnView1 do 
     begin 
     UsedColors:= Proc.CalcImageNumColors; 
     SetLength(RGB_Palette, UsedColors + 1); 
     Proc.CalcImagePalette(RGB_Palette, UsedColors + 1); 
     Proc.ConvertToPalette(UsedColors + 1, @RGB_Palette[0], ieOrdered); 
     Refresh; 
     Proc.Update; 
     IO.Params.BitsPerSample := 8; 
     IO.Params.SamplesPerPixel := 1; 

     IO.SaveToFileBMP('c:\TestFile.bmp'); 
     end; 
    end; 

Cette palette contient des couleurs et utilisé les couleurs inutilisées enter image description here

et cette palette ne contiennent que les couleurs utilisées enter image description here

Répondre

1

Plutôt que de supprimer les couleurs inutilisées, je vous suggère de régler le format de pixel à ie8p puis régler la longueur d'un TColorArray au IEBitmap.PaletteLength itérer puis à travers le IEBitmap.Palette pour remplir le TColorArray.

Cela va produire une liste des couleurs de l'image.

uses ieview, imageenview, imageenproc, hyieutils, hyiedefs, exBitmaps, GraphUtil; 

procedure TForm1.GetPaletteColors; 
{ Fill TColorArray with palette colors. } 
var 
    i: Integer; 
    iColorList: TColorArray; 
begin 
    ImageEnView1.IO.LoadFromFile(OpenPictureDialog1.FileName); 
    { If the bitmap is not 8 bit paletted then convert it } 
    if ImageEnView1.IEBitmap.PixelFormat <> ie8p then 
     ImageEnView1.IEBitmap.PixelFormat := ie8p; 
    SetLength(iColorList, ImageEnView1.IEBitmap.PaletteLength); 
    { Add the colors to the TColorArray } 
    for i := 0 to ImageEnView1.IEBitmap.PaletteLength - 1 do 
    begin 
     iColorList[i].Value := TRGB2TColor(ImageEnView1.IEBitmap.Palette[i]); 
     iColorList[i].Name := ''; 
    end; 
    { sort the colors by HUE - Optional} 
    SortColorArray(iColorList, 0, 0, stHue, False); 
end; 

Vous pouvez obtenir un excellent soutien des développeurs de IMAGEEN si vous avez besoin d'aide ici: http://www.imageen.com/ieforum/forum.asp?FORUM_ID=11

+0

Merci, mais je ne tournerai ma palette à Bitmap fichier – AliReza

+0

@AliReza: Alors peut-être que vous devriez modifier votre question de rendre plus clair ce que vous demandez. –