如何告诉 ghostscript 不要光栅化 eps 文件中的渐变?

Posted

技术标签:

【中文标题】如何告诉 ghostscript 不要光栅化 eps 文件中的渐变?【英文标题】:How can I tell ghostscript not to rasterize gradients in eps files? 【发布时间】:2017-08-06 16:37:03 【问题描述】:

我正在寻找可以让我阅读、编辑和保存 .eps 文件的解决方案。我发现 ghostscript 可以提供所有这些机会。我需要的算法很简单:读取几个 .eps 文件,将它们连接到一个大文件中并保存新的 .eps 文件。我已经可以这样做了,但是有一个问题:新生成和保存的文件不保留渐变。渐变被光栅化,使用渐变的形状被转换为剪贴蒙版。有没有办法告诉ghostscript不要光栅化eps中的渐变?

尽管我的 Windows 是 64 位,但我正在使用最新的 32 位版本的 ghostscript 库(在 64 位版本的 ghostscript 上运行解决方案时出现问题)。实际上它并不那么重要,但我正在使用 C# 和 Ghostscript.Net 编写。

这是示例代码:

using (GhostscriptProcessor processor = new GhostscriptProcessor(lastInstalledVersion, true))

    List<string> switches = new List<string>();
    switches.Add("-o");
    switches.Add(@"-sOutputFile=" + outputFile);
    switches.Add("-sDEVICE=eps2write");
    switches.Add("-dUseCIEColor=true");
    switches.Add("-c");
    switches.Add("<</Install 0.5 0.5 scale>> setpagedevice");
    switches.Add("-f");
    switches.Add(inputFile);

    processor.Process(switches.ToArray());

【问题讨论】:

【参考方案1】:

您所提问题的答案很简单;你不能。 eps2write 设备之所以称为 eps2write 设备,是因为它只生成 2 级 PostScript,而 shfill 运算符或类型 2 模式(PDF 中的着色字典)是 3 级 PostScript 原语。

但是,无论如何,似乎没有充分的理由通过 Ghostscript 运行现有文件。你说你已经有一些 EPS 文件。 EPS 文件的全部意义在于它们可以被视为“黑匣子”,您无需知道其中的内容即可将它们连接、重新排列等。

您所要做的就是编写一些“包装器”PostScript,它会在包含整个 EPS 文件之前更改 CTM。您可以计算出缩放和翻译的参数应该是什么,因为 EPS 文件将有一个 %%BoundingBox 注释,告诉您它在用户空间中的位置。您需要做的就是改变比例,并使用 translate 偏移 0,0 原点(左下角)。

请注意,eps2write 设备由于仅限于生成 2 级 PostScript,因此也不支持原始 2 级规范之外的 PostScript 的一些其他功能,例如 CIDFonts。

【讨论】:

哇!感谢您提供有用的答案!我会尽量按照你说的去做。

以上是关于如何告诉 ghostscript 不要光栅化 eps 文件中的渐变?的主要内容,如果未能解决你的问题,请参考以下文章

Ghostscript:在保持纵横比的同时设置像素宽度,EPS到PNG

Ghostscript:将非常小的 eps 升级为大 jpg

转换ghostscript光栅化器时如何为Jpeg设置dpi

如何使用 ghostscript 调整 .eps 文件的大小

如何在ghostscript中将svg、eps和ai转换为png

未嵌入字体的 Ghostscript 和 PDF