如何从ImgeEN中的调色板中删除未使用的颜色

时间:2016-05-24 20:03:49

标签: delphi delphi-xe delphi-10-seattle

我在Delphi XE 10中使用ImageEN 5.2(DCU版本)。

我想从颜色表(或同一个调色板)中删除未使用的颜色并使用此代码,但这不起作用:(

    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;

此调色板包含用过的颜色和未使用的颜色 enter image description here

和此调色板仅包含使用的颜色 enter image description here

1 个答案:

答案 0 :(得分:1)

我建议将像素格式设置为ie8p,然后将TColorArray的长度设置为IEBitmap.PaletteLength,然后迭代IEBitmap.Palette以填充TColorArray,而不是删除未使用的颜色。

这将生成图像中的颜色列表。

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;

如果您需要此处的进一步帮助,您可以从ImageEn的开发人员那里获得出色的支持: http://www.imageen.com/ieforum/forum.asp?FORUM_ID=11