EPS Returning CMYK result for all type of color format

508 Views Asked by At

I am processing all *.eps files using ImageMagick/Ghostscipt and get the color profiles of each image and display the result. But I am getting same result as CMYK for grayscale, RGB, CMYK.
I don't know where I'm doing a mistake or which property will get the exact result.

C# code

namespace ConsoleApplication3
{
    using System;
    using System.IO;

    using ImageMagick;

    class Program
    {
        static void Main(string[] args)
        {
            foreach (var epsFile in Directory.GetFiles(@"c:\tmp\eps", "*.eps"))
            {
                using (var image = new MagickImage())
                {
                    image.Read(epsFile);

                    Console.WriteLine("file: {0}   color space: {1}", epsFile, image.ColorSpace);
                }
            }
        }
    }
}

Expected result

file: c:\tmp\eps\a.eps   color space: CMYK
file: c:\tmp\eps\b.eps   color space: CMYK
file: c:\tmp\eps\c.eps   color space: CMYK
file: c:\tmp\eps\circle.eps   color space: sRGB
file: c:\tmp\eps\d.eps   color space: CMYK
file: c:\tmp\eps\e.eps   color space: CMYK
file: c:\tmp\eps\f.eps   color space: Grayscale
file: c:\tmp\eps\football_logo.eps   color space: sRGB
file: c:\tmp\eps\fsu_logo.eps   color space: sRGB
file: c:\tmp\eps\g.eps   color space: CMYK
file: c:\tmp\eps\icam_logo.eps   color space: sRGB
Press any key to continue . . .

But result currently coming is

file: c:\tmp\eps\a.eps   color space: CMYK
file: c:\tmp\eps\b.eps   color space: CMYK
file: c:\tmp\eps\c.eps   color space: CMYK
file: c:\tmp\eps\circle.eps   color space: CMYK
file: c:\tmp\eps\d.eps   color space: CMYK
file: c:\tmp\eps\e.eps   color space: CMYK
file: c:\tmp\eps\f.eps   color space: CMYK
file: c:\tmp\eps\football_logo.eps   color space: CMYK
file: c:\tmp\eps\fsu_logo.eps   color space: CMYK
file: c:\tmp\eps\g.eps   color space: CMYK
file: c:\tmp\eps\icam_logo.eps   color space: CMYK
Press any key to continue . . .
1

There are 1 best solutions below

2
On

One simple solution to this is to override the PostScript operators which are used to set colour spaces, such as setrgbcolor, setgray, setcmykcolor and setcolorspace.

Eg:

/system_setrgbcolor /setrgbcolor load def

/setrgbcolor {
  (EPS file used setrgbcolor) == flush
  system_setrgbcolor
}bind def

Or a somewhat more sophisticated solution:

/MyDict 10 dict def
/MyDict begin
/UsedRGB false def
/UsedGray false def
/UsedCMYK false def
end

/system_setrgbcolor /setrgbcolor load def

/setrgbcolor {
  /MyDict /UsedRGB get not {
    (EPS file used setrgbcolor) == flush
    /MyDict /UsedRGB true put
  } if
  system_setrgbcolor
  end
}bind def

The latter should only print the first usage of the colour space.

NB this code is untested and may contain bugs.