ImageEn for Delphi and C++ Builder ImageEn for Delphi and C++ Builder

 

ImageEn Forum
Profile    Join    Active Topics    Forum FAQ    Search this forumSearch
 All Forums
 ImageEn Library for Delphi, C++ and .Net
 ImageEn and IEvolution Support Forum
 How to remove unused color from palette

Note: You must be registered in order to post a reply.
To register, click here. Registration is FREE!

View 
UserName:
Password:
Format  Bold Italicized Underline  Align Left Centered Align Right  Horizontal Rule  Insert Hyperlink   Browse for an image to attach to your post Browse for a zip to attach to your post Insert Code  Insert Quote Insert List
   
Message 

 

Emoji
Smile [:)] Big Smile [:D] Cool [8D] Blush [:I]
Tongue [:P] Evil [):] Wink [;)] Black Eye [B)]
Frown [:(] Shocked [:0] Angry [:(!] Sleepy [|)]
Kisses [:X] Approve [^] Disapprove [V] Question [?]

 
Check here to subscribe to this topic.
   

T O P I C    R E V I E W
zavf Posted - May 24 2016 : 12:07:16
Hello dear friends

I am using ImageEN 5.2 (DCU Version) in Delphi XE 10.

I want to Remove UnUsed Colors from Color Table(or same Palette) and use this Code but this dont work :(




   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;



This Palette contain used colors and unused colors
https://i.imgsafe.org/aaac198.jpg



and This Palette contain only used colors
https://i.imgsafe.org/fc7e079.jpg

Thanks to help me
19   L A T E S T    R E P L I E S    (Newest First)
zavf Posted - May 29 2016 : 14:37:37
Finally i do this

Only Get Used Color from TIEBitmap



    pRGBTripleArray = ^TRGBTripleArray;
    TRGBTripleArray = ARRAY[0..MaxPixelCount-1] OF TRGBTriple;


procedure GetColorList(const Bitmap: TIEBitmap; out UsedColorList: TStringList);
  var
    Flags:  array[byte, byte] OF TBits;
    i    :  Integer;
    j    :  Integer;
    k    :  Integer;
    rowIn:  pRGBTripleArray;
BEGIN
  for j := 0 to 255 do
    for i := 0 to 255 do
      Flags[i,j] := nil;

  UsedColorList.Sorted:= True;
  UsedColorList.Duplicates:= dupIgnore;

  for j := 0 TO Bitmap.Height-1 do
  begin
    Application.ProcessMessages;
    rowIn  := Bitmap.Scanline[j];
    for i := 0 TO Bitmap.Width-1 do
    begin
      with rowIn[i] do
      begin

        if  (not Assigned(Flags[rgbtRed, rgbtGreen])) then
        begin
          Flags[rgbtRed, rgbtGreen]:= TBits.Create;
          Flags[rgbtRed, rgbtGreen].Size:= 256;
        end;

        Flags[rgbtRed,rgbtGreen].Bits[rgbtBlue]:= True;
        UsedColorList.Add(ColorToString(RGB(rgbtRed, rgbtGreen, rgbtBlue)));

      end
    end
  end;
end;

w2m Posted - May 27 2016 : 11:10:03
You will increase the speed if you get pixel colors by using scanline... something like this:
function GetColorFromBmp(X, Y: Integer; Bmp: TIEBitmap): TColor;
var
  Line: pRGBTripleArray;
begin
  Line := Bmp.ScanLine[Y];
  Result := RGBtoColor(Line^[X].rgbtRed, Line^[X].rgbtGreen, Line^[X].rgbtBlue);
end;

Untested code

Bill Miller
Adirondack Software & Graphics
Email: w2m@hughes.net
EBook: http://www.imageen.com/ebook/
Custom Commercial ImageEn Development
zavf Posted - May 27 2016 : 06:51:09
https://i.imgsafe.org/82681b4a74.jpg
zavf Posted - May 27 2016 : 06:30:01
w2m can help me . my code its very very slow and some time my program become hang.
zavf Posted - May 26 2016 : 20:26:11
finally i can add only used color but my way ist very very slow


for i := 0 to ImageEnView1.IEBitmap.PaletteLength - 1 do
        begin
          iColor := TRGB2TColor(ImageEnView1.IEBitmap.Palette[i]);
          ImageEnView1.SelectColors(TColor2TRGB(iColor));
          if ImageEnView1.Selected then
            mbColorPalette1.Colors.Add(ColorToString(iColor));
        end;
zavf Posted - May 26 2016 : 18:24:05
sorry w2m

I need to check Palette[Index] its used in Bitmap?

This code work but very very very slow and finally image dont show correctly



       for i := 1 to ImageEnView1.IEBitmap.Width do
         for j := 1 to imageEnView1.IEBitmap.Height do
           colorlist.Add(ColorToString(TRGB2TColor(ImageEnView1.IEBitmap.Pixels[j, i])));




        for i := 0 to ImageEnView1.IEBitmap.PaletteLength - 1 do
        begin
          iColor := TRGB2TColor(ImageEnView1.IEBitmap.Palette[i]);
          if (colorlist.IndexOf(ColorToString(iColor)) > 0) then
            mbColorPalette1.Colors.Add(ColorToString(iColor))
          else
            Continue;
        end;



See Result
https://i.imgsafe.org/5d7e3f7.png


Thank you for Help Me.
w2m Posted - May 26 2016 : 13:34:50
Show me your code snippet please.

Bill Miller
Adirondack Software & Graphics
Email: w2m@hughes.net
EBook: http://www.imageen.com/ebook/
Custom Commercial ImageEn Development
zavf Posted - May 26 2016 : 13:33:45
In clearly I check color index in palette uses or not usesd.
w2m Posted - May 26 2016 : 13:12:26
Show me the code you used to do this.

Bill Miller
Adirondack Software & Graphics
Email: w2m@hughes.net
EBook: http://www.imageen.com/ebook/
Custom Commercial ImageEn Development
zavf Posted - May 26 2016 : 13:08:10
Thanks w2m

Now how to do check color index uses in bitmap with this way I changed unused color to RGB(0,0,0) , it Ok
w2m Posted - May 26 2016 : 11:08:20
As I have said many times, you can not remove a color. I suspect you do not understand how palette colors work. You can replace a palette color with an alternate color as shown in the demo. The demo does not remove any colors, it just changes them.

Bill Miller
Adirondack Software & Graphics
Email: w2m@hughes.net
EBook: http://www.imageen.com/ebook/
Custom Commercial ImageEn Development
zavf Posted - May 26 2016 : 10:35:31
w2M Please test my image file and give your result.
my image
https://www.mediafire.com/?3k3tzz8ybos1s88

my Result. unused color is not removed !

https://i.imgsafe.org/8101f62.jpg
w2m Posted - May 26 2016 : 09:56:19
You may download a demo here:
http://www.imageen.com/ieforum/topic.asp?whichpage=5&TOPIC_ID=1446#9619
This demo requires downloadingt a color library that uses a color grid from the library or replace the color grid with your own and modify the source code accordingly to handle your color grid.

Bill Miller
Adirondack Software & Graphics
Email: w2m@hughes.net
EBook: http://www.imageen.com/ebook/
Custom Commercial ImageEn Development
zavf Posted - May 26 2016 : 02:09:38
Thanks w2m

Please share this sample project
w2m Posted - May 25 2016 : 12:55:23
My point is that you are loading the palette incorrectly. If you load the palette correctly there is no need to remove unused colors because there are no unused colors.

Here is some code that:

1. Correctly loads the palette from an image into a color grid Unused colors are not loaded.
procedure TForm1.Open1Click(Sender: TObject);
var
  i: Integer;
  iColor: TColor;
begin
  if OpenPictureDialog1.Execute then
    if FileExists(OpenPictureDialog1.FileName) then
    begin
      { In order to be able to load the image palette colors, LegacyBitmap must be
        false, NativePixelFormat must be true and the bitmap must be 8-bit
        paletted }
      { Do not use Windows Bitmaps }
      ImageEnView1.LegacyBitmap := False;
      { Load images in native format }
      ImageEnView1.IO.NativePixelFormat := true;
      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;
      for i := 0 to ImageEnView1.IEBitmap.PaletteLength - 1 do
      begin
        iColor := TRGB2TColor(ImageEnView1.IEBitmap.Palette[i]);
        {Add the palette color to the color grid }
        mbColorPalette1.Colors.Add(ColorToString(iColor));
      end;
       StatusBar1.Panels[0].Text := ExtractFileDir(OpenPictureDialog1.FileName);
       StatusBar1.Panels[1].Text := ExtractFileName(OpenPictureDialog1.FileName);
    end;
end;



2. Sets a selected palette color(s) to a new color value(s).

procedure TForm1.mbColorPalette1CellClick(Button: TMouseButton;
  Shift: TShiftState; index: Integer; AColor: TColor; var DontCheck: Boolean);
begin
  { Get the index of the selected color }
  AIndex := index;
  StatusBar1.Panels[2].Text := 'Index: ' + IntToStr(index);
end;

procedure TForm1.SetPaletteColors1Click(Sender: TObject);
begin
  { Set the selected color grid color to the new color }
  mbColorPalette1.Colors[AIndex] := ColorToString(ColorBox1.Selected);
  mbColorPalette1.Update;
  { Set the palette color to the new color }
  ImageEnView1.IEBitmap.Palette[AIndex] := TColor2TRGB(ColorBox1.Selected);
  ImageEnView1.Update;
end;



3. Save the modified image to a file.
procedure TForm1.SaveAs1Click(Sender: TObject);
begin
  if SavePictureDialog1.Execute then
  begin
    ImageEnView1.IO.SaveToFile(SavePictureDialog1.FileName);
    if ImageEnView1.IO.Aborting then
    begin
      MessageBox(0, 'The image was not saved correctly.', 'Warning', MB_ICONWARNING or MB_OK);
      exit;
    end;
    StatusBar1.Panels[0].Text := ExtractFileDir(SavePictureDialog1.FileName);
    StatusBar1.Panels[1].Text := ExtractFileName(SavePictureDialog1.FileName);
  end;
end;



Bill Miller
Adirondack Software & Graphics
Email: w2m@hughes.net
EBook: http://www.imageen.com/ebook/
Custom Commercial ImageEn Development
zavf Posted - May 25 2016 : 11:23:20
Thanks xequte

This my Project with image bmp file (even or other bmp file same this problem)

in dir win32\debug file "Remove unused color by other software.pcx" its removed unused color by other software and I want to do this by imageEn.


Please see my project and help me

Download link project file compiled with xe10
https://www.mediafire.com/?1lt445v4bs6sqn2
xequte Posted - May 24 2016 : 20:08:16
Hi

Can you also attach your source image?

Nigel
Xequte Software
www.xequte.com
nigel@xequte.com
zavf Posted - May 24 2016 : 17:47:49
Thanks But i need change Bitmap palette and save file with used color in palette and unused color will be removed.

please help
w2m Posted - May 24 2016 : 17:06:40
Rather than removing unused colors I'd suggest setting the pixel format to ie8p then set the length of a TColorArray to the IEBitmap.PaletteLength then iterate through the IEBitmap.Palette to fill the TColorArray.

This will produce a list of the colors in the image.

uses ieview, imageenview, imageenproc, hyieutils, hyiedefs, iexBitmaps, 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;

Bill Miller
Adirondack Software & Graphics
Email: w2m@hughes.net
EBook: http://www.imageen.com/ebook/
Custom Commercial ImageEn Development