我在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;
答案 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