Ghostscript - EPS(带有透明背景的嵌入式 TIFF)到 PNG 转换

Posted

技术标签:

【中文标题】Ghostscript - EPS(带有透明背景的嵌入式 TIFF)到 PNG 转换【英文标题】:Ghostscript - EPS (with embedded TIFF with transparent background) to PNG conversion 【发布时间】:2018-12-03 21:43:08 【问题描述】:

我正在尝试使用 GhostScript 将具有透明背景的嵌入 TIFF 的 EPS 文件转换为 PNG。我遇到的问题是 TIFF 图像的背景在 PNG 中变为白色。如下所示:

IncorrectPNG

当我从 Adob​​e Illustrator 导出时,结果是正确的:

CorrectPNG

我读到 EPS 没有透明度,只有标记和未标记的区域。我想知道是否有一个我错过的调用可以通过类似于 Illustrator 的 Ghostscript 创建 PNG?或者如果有任何其他替代方案不只是通过 ImageMagick 将白色替换为透明度?

我使用的是 Windows 并安装了 Ghostscript 9.25。这是我尝试过的命令(其中之一):

-q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -sDEVICE=pngalpha -r300 -dEPSCrop NamePlatePNG.png NamePlate.eps

如果需要,我可以将 EPS 文件发给您。任何帮助将不胜感激,谢谢!

更新: 这是 EPS 文件(希望此链接有效):

https://drive.google.com/open?id=1m4HHGLoPe0jdWkx1Oghe7ttiXPldZnJs

另外,我应该提到我上传的图像只是在图像编辑器中打开的 PNG 的屏幕截图。方格部分确实是完全透明的 Alpha 通道。我试图轻松地强调差异。

【问题讨论】:

如果您的 EPS 文件(或者可能是嵌入的 TIFF)是 CMYK 颜色空间,那么如果它具有透明度,Ghostscript 将无法正确处理它。所以你需要在读入它时将它转换为 sRGB 颜色空间。在 ImageMagick 中,我会做convert -colorspace SRG -density 300 input.EPS output.png。如果这不起作用,请发布指向您的 EPS 文件的链接。抱歉,我不知道 Ghostscript 转换为 sRGB 的参数。 我上面的命令有错字。它应该是 -colorspace sRGB,而不是 -colorspace SRG。 如果您想要默认密度 72 以外的其他值,可以将 -density 300 添加到 ImageMagick 命令中。所以convert -colorspace sRGB -density 300 input.eps output.png。您可能需要编辑 policy.xml 文件以放宽对 PDF、EPS、PS 等的安全限制。请参阅***.com/questions/52861946/…。 感谢您的快速回复!我确实通过 ImageMagick 尝试了这个命令,它产生的结果与我发布的 Ghostscript 命令相同。如果您想查看它,我确实发布了 EPS 文件。感谢您的帮助。 当我使用convert -colorspace sRGB NamePlate.eps NamePlate.png 时,我得到的结果与您相同,只有顶部透明。对不起,我不知道出了什么问题。在 Photoshop 中打开时,我得到了同样的结果。所以也许这就是 EPS 文件的创建方式。 【参考方案1】:

您的文件看起来不像是透明的,它看起来像是被蒙版的,可能带有模板蒙版,可能带有色键。没有看到文件,我无法确定。

您是正确的,PostScript(以及 EPS)不支持透明度,但它确实支持一些具有类似效果的功能。

颜色空间是无关紧要的,事实上,PostScript 中唯一支持的“透明度”在颜色空间为 CMYK 时有效,但在其 RGB(当然不是 sRGB,它甚至不是 PostScript 颜色空间)时无效, 你必须从 CIEBasedABC 制造它)

据我所知,您使用的命令行是正确的,但正如我所说的,如果没有看到实际的 EPS 程序,我就不能说太多。

[编辑] 所以 Ghostscript 渲染是正确的,这就是你的 EPS 文件中的内容,那里没有任何类型的透明度。那么 Illustrator 是如何制作透明 PNG 的呢?答案是 Illustrator 没有使用 EPS 文件的 PostScript 部分。

在 EPS 文件的大约 1/3 处,您会看到一行内容:

%AI9_PrivateDataBegin

接下来是 Adob​​e Illustrator 文件格式。当 AI 读取文件时,它会找到该行,丢弃文件的 PostScript 部分,并从文件中以该注释开头的部分读取内容的 AI 表示。

现在存储在某处的信息将表明部分内容是透明的。虽然 PostScript 不能表示,但 Illustrator 的内部格式可以。因此,当您从 Illustrator 编写 PNG 文件时,它会知道该部分是透明的并照此写入。

但是,Ghostscript 受到文件的 PostScript 部分的限制,它无法读取 Illustrator 原生格式,因此以白色背景渲染图像。

“可能”从 Illustrator 中保存不同类型的 EPS(可能是 3 级而不是 2 级,我注意到这是一个语言级别 2 的 EPS 文件),它复制了效果,但是从你这里的内容来看,标准 PostScript 解释器无法为您提供任何想要的结果。

【讨论】:

对不起,我应该提到我上传的图像只是在图像编辑器中打开的 PNG 的屏幕截图。方格部分确实是完全透明的 Alpha 通道。我试图轻松地强调差异。如果您想查看我正在处理的内容,我刚刚上传了 EPS 文件。如果它不起作用,请告诉我,我会尝试不同的方法。非常感谢您的快速回复。 另一个注意事项,当我在 Illustrator 中打开 EPS 文件并选择图像时,Illustrator 指出图像是“透明 CMYK”。

以上是关于Ghostscript - EPS(带有透明背景的嵌入式 TIFF)到 PNG 转换的主要内容,如果未能解决你的问题,请参考以下文章

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

Ghostscript将多个eps文件连接成一个大eps文件

使用 GhostScript 将 PDF 转换为透明 PNG

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

改进我的 ghostscript eps 压缩脚本

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