Pdfwrite Ghostscript в градациях серого приводит к неправильному уровню серого

Я пытаюсь преобразовать файл PDF (test.pdf, прикрепленный ниже), используя Ghostscript (9.20 для Windows), чтобы использовать только цветовое пространство 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 (откройте его в программе просмотра PDF и сравните сами).

Кто-нибудь видит мою ошибку или что я должен сделать по-другому, чтобы получить тот же PDF, но в оттенках серого, а не в цветовом пространстве RGB?

Большое спасибо!

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

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

2 ответа

Вы выполняете многократное преобразование и совсем не управляете преобразованиями цветового пространства.

Сначала вы конвертируете исходный цвет в цветовое пространство на основе CIE (и пространство меняется в зависимости от количества компонентов в исходном пространстве). Поскольку вы не указываете словари цветопередачи, это неконтролируемое преобразование, вы используете значения по умолчанию.

Затем вы приступаете к другому преобразованию из CIEBased (которое, как правило, в любом случае не может быть представлено в PDF, поэтому всегда приведет к дополнительному преобразованию) в DeviceGray. Опять же, вы не предоставили никаких профилей ICC для этого преобразования, поэтому вы используете профили по умолчанию.

Если вы настаиваете на использовании -dUseCIEColor (что я бы очень настоятельно рекомендовал, контролировать это сложно), то вам необходимо предоставить словари ColorRendering для управления преобразованием из пространства устройства в пространство CIE, а также профили ICC для управления последующим преобразованием из CIE пространство в DeviceGray.

Но я сильно подозреваю, что вы получите лучшие результаты, если не будете использовать -dUseCIEColor, как говорит Ghostscript.

Я могу только догадываться о том, что вам нужно, основываясь на исходном файле. Там в DeviceRGB 0,5/0,5/0,5 заполненный прямоугольник, и я подозреваю, что вы хотите, чтобы он стал 0,5 DeviceGray,

Решения и предположения ниже будут работать только для этого и подобных случаев. (Например, я понятия не имею, что такое "значения CMY", о которых вы пишете, т.е. DeviceCMYK или же ICC-based или что-нибудь еще в ваших файлах). Есть простые формулы для преобразования между цветовыми пространствами устройства (см. PDF Reference), одна из которых действительно отображает одинаковые значения в 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 или же DeviceGray вывод (или вывод на основе ICC, что угодно). Те же самые значения цвета в произведенных файлах.

Буду признателен, если кто-то укажет, что я неправ, и покажет противоположный пример.

На самом деле это сработало (частично - только для исходных цветов устройства) в 9.10:

"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

Использование разных профилей icc приводит к разным (и, похоже, правильным) выводам. Чтобы преобразовать одинаковые значения RGB в одинаковые значения серого, потребуется профиль в градациях серого с той же гаммой, что и (по умолчанию). sRGB, Просто используйте бесплатно ICC Profile Inspector извлечь кривую из sRGB и импортировать его, например, в sgray.icc (распространяется с Ghostscript).

Преимущество использования профиля для преобразования RGB в серый с сохранением гаммы по сравнению с "простой формулой", описанной выше, может стоить или не стоить усилий. Проверьте ваши файлы и цели.

Другие вопросы по тегам