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



我想使用重影脚本将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 MacBook,当我在内置预览工具中查看原始PDF时,颜色没有转换后的颜色那么饱和。

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

谢谢!

很明显,颜色不可能是"相同的",因为一个在减法4色模型中表示,另一个在加法3色模型中表达。

首先,你使用三个命令行开关,它们根本不会有任何效果:

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

-sColorConversionStrategy仅适用于pdfwrite设备,该设备能够处理几乎所有的颜色模型。大多数设备,如PNG,只支持单一颜色模型,因此您不需要指定颜色转换,所有设备都必须转换到该颜色空间。

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

最后也是最重要的一点;您已经设置了CCD_ 4。这是一个古老的PostScript颜色管理控件;它使所有颜色被转换成CIE空间,CIEBasedA、CIEBasedABC、CIEBasedDEF或CIEBasedDEFG。从那里,颜色被转换到目的地空间。使用它将在很大程度上打破Ghostscript中的ICC配置文件颜色管理。

所以把这四个都放下,再试一次。请注意,当您将PNG结果与PDF进行比较时,您将比较Ghostscript执行的颜色转换与PDF消费者执行的颜色转换器(CMYK->RGB),可能是内置的Mac Quartz代码。我不得不对这种转换的质量表示一些保留意见。

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

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

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

注意,以上所有假设未提供的原始PDF实际上指定了CMYK中的颜色,而不是基于ICC-Based颜色空间或其他类似的与设备无关的颜色空间中的颜色。

编辑

来自评论:

根据您的论证,它应该是相同的

否。在PDF消费者的情况下,它正在进行CMYK->RGB转换以显示内容。当渲染到PNG时,Ghostscript也在进行CMYK->RGB转换。实际上,因为您使用-dUseCIEColor,所以它正在进行CMYK->CIEBasedDEFG->RGB转换,但假设你放弃了它,所以它只是在做CMYK->RGB。

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

如果没有看到你的PDF文件,我就无法判断其中的颜色是如何指定的。你说它们是"CMYK",但CMYK不是一个特征空间。有许多不同的CMYK油墨,它们以不同的反射率和吸收性印刷在许多不同种类的纸张上。所以SWOP和Euroscale都是CMYK印刷工艺,但它们的特点不同。

因此,如果我们将您的CMYK值视为SWOP,并将其转换为RGB空间,我们应该期望与相同CMYK的值不同的RGB值,就像它们是Euroscale一样。这是因为同样的CMYK四边形印刷到SWOP工艺将不同于在Euroscale工艺上的外观。

在创建RGB值时也是如此。RGB也不是一个特征空间,有许多不同的RGB输出设备,它们在显示给定RGB三元组的方式上有所不同。

现在我不知道你的PDF消费者是如何进行CMYK->RGB转换。我想它会使用ICC档案来描述空间,但可能不会。PostScript语言参考中有一种长期存在的(快速而肮脏的)转换方法,它可能会使用它。

然而,现代颜色管理工作流程将使用ICC配置文件。

当处理诸如"CMYK"或"RGB"之类的非特征空间时,Ghostscript唯一能做的就是使用通用配置文件。它使用通用CMYK配置文件将输入的CMYK转换为CIE XYZ空间(与设备无关),然后使用通用RGB配置文件将CIE XYZ分量转换为RGB。您可以更改关于输入和输出颜色空间的假设。

实际上,你可以说"我碰巧知道CMYK值是为HP Indigo准备的,所以使用HP Indigo ICC配置文件",然后将CMYK映射到XYZ中,作为原始创建者的意图。类似地,你可以说"我使用的是索尼的宽色域RGB显示器,所以使用ICC配置文件",这将在该设备上提供XYZ颜色的最佳表现。

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

因此,尝试并总结;问题是你使用的是不典型的空格。这两个消费者没有设置为使用相同的默认颜色管理路径,因此您可以看到差异。为了避免这种情况,您需要在两个PDF使用者(预览和Ghostscript)上使用相同的配置文件。

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

最新更新