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 в серый с сохранением гаммы по сравнению с "простой формулой", описанной выше, может стоить или не стоить усилий. Проверьте ваши файлы и цели.