Ghostscript 将 cmyk-PDF 转换为 rgb-PNG 并保留正确的颜色

Ghostscript convert cmyk-PDF to rgb-PNG and preserving correct colors

我想使用 ghostscript 将 CMYK-PDF 转换为 rgb-PNG。

这是我目前使用的:

gs -sDEVICE=pngalpha -dBATCH -dNOPAUSE -dCompatibilityLevel=1.4 -dColorConversionStrategy=/sRGB -dProcessColorModel=/DeviceRGB -dUseCIEColor=true -sOutputFile=out.png -r300 pdf/input.pdf

但问题是颜色转换不准确。我正在使用 Mac OS Catalina Mac 书籍,当我在内置预览工具中查看原始 PDF 时,颜色不如转换后的颜色饱和。

所以我的问题是我做错了什么?我不是色彩管理专家。

谢谢!

嗯,显然颜色不能是 'same',因为一种是用减色 4 色模型表示的,另一种是加色 3 色模型。

首先,您使用了三个根本不会产生任何影响的命令行开关:

-dCompatibilityLevel仅用于pdfwrite设备设置PDF支持的最高版本,对其他设备没有影响,当然也不会影响PNG输出设备。

-sColorConversionStrategy 仅适用于 pdfwrite 设备,它能够处理几乎所有颜色模型。大多数设备,例如 PNG 仅支持单一颜色模型,因此您无需指定颜色转换,它都必须转换为该颜色 space.

你永远不应该设置 -dProcessColorModel。这必须对设备保持正确;在高级设备的情况下,它被忽略,或者适当地设置为与 ColorConversionStrategy 相同。

最后也是最重要的;您已设置 -dUseCIEColor。这是一个古老的 PostScript 颜色管理控件;它会导致所有颜色都转换为 CIE spaces,即 CIEBasedA、CIEBasedABC、CIEBasedDEF 或 CIEBasedDEFG。颜色从那里转换为目标 space。使用它几乎会破坏 Ghostscript 中的 ICC 配置文件颜色管理。

所以放弃所有这四个,然后再试一次。请注意,当您将 PNG 结果与 PDF 进行比较时,您是在将 Ghostscript 执行的颜色转换与 PDF 使用者执行的颜色转换(CMYK->RGB)进行比较,大概是内置的 Mac Quartz 代码。我不得不对该转换的质量表示一些保留意见。

您完全可以控制 Ghostscript 执行的颜色管理。有默认的 RGB 和 CMYK 配置文件,用于将 CMYK 组件转换为 CIE XYZ 校准 space,然后从那里转换为 RGB。 ICC 配置文件中的每一种用途。如果您不喜欢默认的,您可以用您选择的另一个替换其中一个或两个。 ICC 配置文件可以在 ghostpdl/iccprofiles 目录中找到,您可以使用 -sDefaultCMYKProfile=<...path...> 指定不同的配置文件以用于将 CMYK 转换为 CIE-XYZ,并使用 -sOutputICCProfile=<...path...> 指定不同的 ICC 配置文件以用于用于最后的 space(在您的情况下为 RGB)。

对于正确的颜色管理工作流程,您应该知道指定输入颜色模型(例如 SWOP CMYK)的特征并使用正确的 ICC 配置文件从 CMYK 映射到 CIE-XYZ,并且您应该知道输出颜色的特征模型(例如 Sony Trinitron,使用旧显示器示例)来创建最接近的匹配输出颜色。

可能有一个显示器的 ICC 配置文件,我怀疑您是否知道原始 PDF 文件中的 CMYK 值代表什么。要匹配您正在使用的任何 PDF 消费者,您需要知道它正在使用什么 CMYK 和 RGB 输出配置文件,并在 Ghostscript 渲染过程中使用相同的配置文件。

注意以上所有假设未提供的原始 PDF 实际上指定了 CMYK 颜色,而不是 ICCBased 颜色 space 或其他类似的设备无关颜色 space.

编辑

来自评论:

Following your argumentation it should be identical

没有。对于 PDF 消费者,它正在执行 CMYK->RGB 转换以显示内容。渲染为 PNG 时,Ghostscript 也会进行 CMYK->RGB 转换。实际上,因为您使用的是 -dUseCIEColor,它正在执行 CMYK->CIEBasedDEFG->RGB 转换,但假设您放弃了它,所以它只是在执行 CMYK->RGB。

现在,如果 这两个转换是完全颜色管理的,让我们假设现在 ICC 配置文件作为颜色管理技术,并且这两个转换使用 相同 ICC 配置文件,即假设特征相同space,那么结果将是相同的。

在没有看到您的 PDF 文件的情况下,我无法判断其中的颜色实际是如何指定的。你说它们是 'CMYK' 但 CMYK 不是特征 space。有许多不同的 CMYK 油墨,它们被印刷到许多具有不同反射率和吸收性的纸张上。所以SWOP和Euroscale都是CMYK印刷工艺,只是它们的特点不同。

因此,如果我们将您的 CMYK 值视为 SWOP 并将它们转换为 RGB space,我们应该期望不同的 RGB 值与那些相同的 CMYK 值(就像它们是 Euroscale 一样)。那是因为打印到 SWOP 流程的相同 CMYK 四边形会与 Euroscale 流程上的外观不同。

创建 RGB 值时类似。 RGB 也不是特征 space,有许多不同的 RGB 输出设备,它们在显示给定 RGB 三元组的方式上有所不同。

现在我不知道你的 PDF 消费者是如何进行 CMYK->RGB 转换的。我想认为它使用 ICC 配置文件来表征 space,但它可能不会。 PostScript 语言参考中有一个长期存在的(快速而肮脏的)转换方法,它可能会使用它。

但是,现代色彩管理工作流程将使用 ICC 配置文件。

在处理 'CMYK' 或 'RGB' 等未表征的 space 时,Ghostscript 唯一能做的就是使用通用配置文件。它使用通用 CMYK 配置文件将传入的 CMYK 转换为 CIE XYZ space(与设备无关),然后使用通用 RGB 配置文件将 CIE XYZ 分量转换为 RGB。您可以更改有关输入和输出颜色的假设 spaces.

实际上,您可以说 'I happen to know that the CMYK values were intended for an HP Indigo, so use the HP Indigo ICC profile',然后它将按照原始创作者的意图将 CMYK 映射到 XYZ。同样,您可以说“我使用的是 Sony 宽色域 RGB 显示器,因此请使用该 ICC 配置文件”,这将在该设备上提供 XYZ 颜色的最佳表现。

但如果明天您在低端 Iiyama 显示器上查看它,您可以告诉它使用不同的适当配置文件,并且您会看到(尽可能)与昂贵设备上相同的颜色。

所以试着总结一下;问题是您使用的是非特征化的 spaces。两个消费者未设置为使用相同的默认颜色管理路径,因此您可能会看到差异。为避免这种情况,您需要在两个 PDF 使用者(预览版和 Ghostscript)上使用相同的配置文件。

我不记得 PNG 是否允许您在文件中保存 ICC 配置文件。如果是这样,那么您可以将 PNG 文件带到另一台具有不同显示器的计算机上,它看起来仍然是一样的。如果不是(我认为不是),那么在不同的显示器上查看 RGB 输出会有所不同。