Ghostscript的pdfwrite到灰度导致错误的灰度

时间:2017-02-23 08:43:15

标签: pdf ghostscript grayscale pdf-conversion

我尝试使用Ghostscript(Windows上9.20)转换PDF文件(test.pdf,附后),仅使用Graylevel颜色空间(不是RGB或CMY):

gswin64c.exe -sDEVICE=pdfwrite -sProcessColorModel=DeviceGray -sColorConversionStrategy=Gray -dOverrideICC -dUseCIEColor -o gray.pdf -f test.pdf

结果确实只使用灰色:

>gswin64c.exe -o - -sDEVICE=inkcov gray.pdf
GPL Ghostscript 9.20 (2016-09-26)
Copyright (C) 2016 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
 0.00000  0.00000  0.00000  0.92673 CMYK OK

(我需要使用-dUseCIEColor,否则CMY值> 0,这是一个我尚未解决的单独问题......)

我的问题:生成的gray.pdf使用与原始test.pdf明显不同的graylevels(在PDF查看器中打开并自行比较)。

是否有人看到我的错误或我应该做些什么来获得相同的PDF但是在灰度而不是RGB色彩空间?

非常感谢!

test.pdf:https://drive.google.com/open?id=0BzjatAIrG6P3S2F5Vng4cUhUS0U

gray.pdf:https://drive.google.com/open?id=0BzjatAIrG6P3cEtTY3JaaTJCS2c

2 个答案:

答案 0 :(得分:1)

您正在进行多次转换,而根本不管理色彩空间转换。

首先,将原始颜色转换为基于CIE的颜色空间(并且空间根据原始空间中的组件数量而变化)。由于您没有指定Color Rendering Dictionaries,这是一个不受控制的转换,您使用的是默认值。

然后您开始从CIEBased进行另一次转换(通常不能用PDF表示,因此总是会导致额外的转换)到DeviceGray中。同样,您还没有为此转换提供任何ICC配置文件,因此您使用的是默认配置文件。

如果你坚持使用-dUseCIEColor(我非常强烈建议反对,控制这很难),那么你需要提供ColorRendering Dictionaries来控制从设备空间到CIE空间的转换,以及ICC配置文件来控制随后的从CIE空间转换为DeviceGray。

但是我强烈怀疑你不会使用-dUseCIEColor来获得更好的结果,就像Ghostscript告诉你的那样。

答案 1 :(得分:0)

我只能根据源文件猜测你需要什么。那个DeviceRGB 0.5 / 0.5 / 0.5填充矩形,我怀疑你希望它变成0.5 DeviceGray

以下解决方案和推测仅适用于此类和类似案例。 (例如,我不知道您撰写的" CMY值" 是什么,即文件中是否有DeviceCMYKICC-based或其他内容)。有简单的公式可以在设备颜色空间之间进行转换(参见 PDF参考),其中一个确实从DeviceRGB中的相等值映射到DeviceGray中的相同值。要使其有效,请使用GhostScript 9.10

"C:\Program Files\gs\gs9.10\bin\gswin32c.exe" -sDEVICE=pdfwrite -sProcessColorModel=DeviceGray -sColorConversionStrategy=Gray -dUseFastColor -o test_1.pdf -f test.pdf

请注意开关-dUseFastColor。你得到"正确" 0.5灰度填充矩形。

要使其在版本 9.10 .. 9.20 (不包括两者)中运行,我必须添加另一个开关:-dPDFUseOldCMS。同样,结果是0.5灰度填充矩形。

正如上一个开关名称所示,简单的事情可能被认为已弃用,看起来像是在 9.20 中被废弃。

相反,引入了新的精彩CMS引擎(因为 9.10 )。除此之外,它不适用于高级设备(包括pdfwrite)。许多版本都关闭或破坏。

我无法在源代码和命令行选项中使用任何基于设备或ICC的颜色组合,以使其实际使用-sOutputICCProfile选项,用于DeviceCMYK或{ {1}}输出(或基于ICC的输出,无论如何)。生成的文件中的颜色值相同。

如果有人表示我错了,显示相反的例子,我会感激。

实际上(部分 - 仅限设备源颜色), 9.10

DeviceGray

使用不同的icc配置文件会产生不同的(并且看起来正确)输出。要将相等的RGB值转换为相同的灰度值,需要具有与(默认)"C:\Program Files\gs\gs9.10\bin\gswin32c.exe" -sDEVICE=pdfwrite -sProcessColorModel=DeviceGray -sColorConversionStrategy=Gray -sOutputICCProfile=sgray.icc -o test_2.pdf -f test.pdf 相同的伽玛的灰度轮廓。只是,使用免费sRGBICC Profile Inspector中提取曲线并将其导入例如sRGBsgray.icc(随Ghostscript分发)。

使用配置文件将RGB转换为灰色,保留伽玛的优势,与简单的公式相对应"如上所述,可能或可能不值得努力。检查您的文件和目的。