【问题标题】:How can I extract color values from an EPS file?如何从 EPS 文件中提取颜色值?
【发布时间】:2013-05-16 20:30:18
【问题描述】:

我正在尝试查找 EPS 文件中使用的所有填充和描边值。我可以解析文件,只是不知道如何在 EPS postscript 部分定义颜色值。我已将文件转换为 SVG(使用 ghostscript),并且可以获得十六进制值,但是使用渐变的 EPS 到 SVG 转换会产生 20 倍大小的文件。我可以从 EPS 文件中提取 postscript 中颜色值的标准格式吗?

【问题讨论】:

    标签: vector ghostscript postscript eps


    【解决方案1】:

    PostScript 是一种编程语言,而不是简单的文件格式,因此没有简单的方法可以确定程序中发生了什么。

    渐变可以很好地定义为 PostScript 中的平滑阴影,这是一种高级构造,在 SVG 中没有等效物,因此它将被渲染为图像(因此尺寸爆炸)。

    您可以通过重新定义基本操作来利用 PostScript 是一种编程语言这一事实​​,并使用它来获取您想要的信息。例如,要查找用于笔画的颜色,您可能会这样做:

    /OriginalStroke /stroke load def
    /stroke {
    (Current colour space = ) print currentcolorspace == flush
    (current colour = ) print mark currentcolor counttomark -1 1 { -1 roll 20 string cvs print ( ) print} for flush pop
    OriginalStroke
    } bind def
    

    当然,您需要准备好应对 PostScript 中丰富多样的可能色彩空间;灰色、RGB、CMYK、分离、DeviceN、CIEBasedA、CIEBasedABC、CIEBasedDEF、CIEBasedDEFG、索引和图案。

    您可能不需要知道原始值,我猜这是真的,因为我认为转换为 SVG 会将所有颜色转换为 RGB,因此您可能只需要 RGB 等价物。在这种情况下,您可以简单地使用:

    (current colour in RGB = ) print currentrgbcolor 3 -1 roll == exch == == flush
    

    我不知道你会如何处理带有图案颜色的填充 :-)

    也许如果你解释了你想知道这个的原因,它会更容易提供帮助。

    【讨论】:

    • 感谢您的详细回复。我的目标是提取矢量图像(EPS 输入)中最常用的十六进制值。我尝试通过光栅化矢量然后解析直方图来做到这一点,但是在图像被光栅化后颜色值关闭。在将 EPS 转换为 SVG 然后解析输出时,我能够提取精确的十六进制值,但这会导致大小爆炸并且需要一段时间来处理。如何从命令行对 EPS 文件运行您的命令(RGB 中的当前颜色)?
    • 从命令行执行有点大,把它放在一个文件中,然后在你要采样的文件之前立即执行该文件。即'gs file1.ps file2.eps
    • 有趣的想法。我执行了“gs color.ps myfile.eps”,我在 color.ps 文件的顶部得到了“RGB 中的当前颜色 = 0.0”的输出是 %!PS。它似乎没有在 myfile.eps 上运行 color.ps。我错过了什么?
    • 错误,该行应该插入到“OriginalStroke”过程中,以代替最初的两行“(当前颜色空间=)...”和“(当前颜色=).. .' 就其本身而言,它不会做任何有用的事情。代码所做的是将“笔画”运算符替换为获取所需信息的过程,然后执行笔画的先前定义。显然,为了完整性,您将需要类似的代码来填充、eofill、rectstroke、rectfill、ustroke、ufill 和 ueofill。我不知道你想用更复杂的 shfill 或模式空间做什么。
    • 这就是我要找的方向!谢谢。
    【解决方案2】:

    如果您所做的只是获取直方图并将其丢弃,那么位图的大小并不重要:

     pstopnm -stdout file.ps | ppmhist
    

    假设每个人都有 netpbm...netpbm.sourceforge.net

    【讨论】:

    • 我要试一试,但这不会光栅化图像,因此 EPS 的颜色值会不正确吗?我正在尝试提取准确的颜色值。
    • 图像将被渲染,是的,并将转换为 RGB。请注意,正如我上面提到的,PostScript 中有 很多 的色彩空间,而不仅仅是 RGB。你打算如何处理模式?如果我用图案填充矩形,则用于绘制图案的颜色值是使用一次还是平铺该区域所需的多次?如果渲染为位图,则结果将是“平铺区域所需的次数”
    • 我想它不清楚所需的输出是什么。如果一个页面使用了一堆不同的颜色空间,您是否需要所有这些信息:此页面使用以下颜色空间以及每个颜色空间中的颜色规范列表?否则不清楚你所说的“确切”是什么意思
    • 我希望在其相对颜色空间、RGB、CMYK、灰色等中为每种颜色提供文本输出。当我光栅化矢量图像时,我的颜色值会失真,这就是我尝试的原因弄清楚如何直接从 PostScript 编程中提取值。 KenS 的想法很有趣,在 EPS 上执行 PS 命令来提取值。
    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 2021-01-02
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多