Распознавание цвета Ghostscript

Кажется, я не могу найти, может ли Ghostscript просто определить, является ли задание цветным или в оттенках серого. Я использую Ghostscript для преобразования заданий печати в PNG, но мне также нужна информация о цвете задания, чтобы мне не приходилось снова искать его попиксельно.


person Matthew Lowe    schedule 06.09.2012    source источник


Ответы (2)


(Относительно новое) устройство Ghostscript под названием inkcov (вам нужен Ghostscript версии 9.05 или новее) может надежно определять, использует ли страница PDF цвет или нет.

Он отображает покрытие красками CMYK отдельно для каждой отдельной страницы (для цветов RGB выполняется внутреннее преобразование в цветовое пространство CMYK).

Чтобы исследовать и продемонстрировать его функции, сначала создайте пример PDF с помощью Ghostscript:

gs                                                                     \
  -o color-or-grayscale-test.pdf                                       \
  -sDEVICE=pdfwrite                                                    \
  -g5950x2105                                                          \
  -c "/F1 {10 80 moveto /Helvetica findfont 64 scalefont setfont} def" \
  -c "F1                         (100% 'pure' black)    show showpage" \
  -c "F1 .5 .5 .5   setrgbcolor  ( 50% 'rich' rgbgray)  show showpage" \
  -c "F1 .5 .5 .5 0 setcmykcolor ( 50% 'rich' cmykgray) show showpage" \
  -c "F1 .5         setgray      ( 50% 'pure' gray)     show showpage"

Хотя человеческому глазу кажется, что все страницы вообще не используют цвета, страницы 2 и 3 действительно смешивают свои видимые оттенки серого с цветом. Но ни один из цветов не виден напрямую (если только ваш монитор не настроен неправильно).

Посмотрите на получившиеся PDF-страницы (преобразованные в PNG для более удобного отображения в Интернете):

4 страницы PDF без видимого цвета

В индустрии допечатной подготовки часто используются «насыщенные» черные или оттенки серого. Идиома «насыщенный» черный или серый используется для обозначения того факта, что эти оттенки сделаны не из чисто черного тонера или чернил, а содержат смешанные цветовые компоненты, которые делают их более яркими и насыщенными.

Теперь проверьте покрытие чернилами каждой страницы:

gs  -o - -sDEVICE=inkcov color-or-grayscale-test.pdf
 [...]
 Page 1
  0.00000  0.00000  0.00000  0.05040 CMYK OK
 Page 2
  0.05401  0.05401  0.05401  0.05401 CMYK OK
 Page 3
  0.05799  0.05799  0.05799  0.00000 CMYK OK
 Page 4
  0.00000  0.00000  0.00000  0.04541 CMYK OK

(Значение 1,00000 соответствует 100%-му покрытию чернилами для соответствующего цветового канала. Таким образом, 0.05040 в первой строке результата означает, что 5.04 % области страницы покрыто черными чернилами.) Следовательно, результат inkcov Ghostscript является в точности ожидаемым. один:

  • страницы 1 + 4 не используют цвета C (голубой), M (пурпурный), Y (желтый), а только K (черный).
  • на страницах 2 + 3 используются чернила цветов C (голубой), M (пурпурный), Y (желтый), но не K (черный).

Теперь давайте конвертируем все страницы исходного PDF-файла, чтобы использовать цветовое пространство DeviceGray:

gs                                \
  -o only-black-ink.pdf           \
  -sDEVICE=pdfwrite               \
  -dColorConversionStrategy=/Gray \
  -dProcessColorModel=/DeviceGray \
   color-or-grayscale-test.pdf

...и снова проверьте покрытие чернилами:

gs -q  -o - -sDEVICE=inkcov only-black-ink.pdf | grep -v Page
  0.00000  0.00000  0.00000  0.05040 CMYK OK
  0.00000  0.00000  0.00000  0.05401 CMYK OK
  0.00000  0.00000  0.00000  0.05799 CMYK OK
  0.00000  0.00000  0.00000  0.04541 CMYK OK

Опять же, именно ожидаемый результат в случае успешных преобразований цвета!

person Kurt Pfeifle    schedule 06.09.2012
comment
Это также быстрый способ, если вам нужно оценить расход тонера для файла печати. - person Douglas Anderson; 25.04.2013
comment
Если кому-то понадобится сделать это на ruby, вот гем rubygems.org/gems/pdf_colored_pages, который выводит массив, содержащий номера страниц (например, 1,3,4) или строку диапазона, например «1,3-4», путем анализа вывода ghostscript inkcov. - person RedRoosterMobile; 26.05.2016

Новое устройство вывода сделало этот ответ устаревшим, см. Принятый ответ.


До 2011 года файл нужно было растрировать, чтобы увидеть результат. Поскольку PDF/PS представляет собой описание того, как выглядит файл, который отображается во время растрирования. Даже если бы вы могли сделать это с помощью ghostscipt, я уверен, что сначала нужно будет растеризовать/интерпретировать файл, а затем посмотреть на результат, поэтому, если у вас есть png, вы также можете сделать это самостоятельно, что будет менее интенсивно использовать процессор, чем обработка файл снова с GS.

person Mark Redman    schedule 06.09.2012
comment
... и я почти уверен, что ваше утверждение вы не можете этого сделать было правильным примерно год назад, но сейчас это не так :-) -- Поэтому, пожалуйста, удалите (или отредактируйте) ваш ответ, прежде чем за него проголосуют... :-) - person Kurt Pfeifle; 07.09.2012