Файлы CMYK JPEG, извлеченные из PDF, отображаются инвертированными

Мне приходится иметь дело с CMYK JPEG, извлеченными из источника PDF. PDF-файлы были созданы с помощью Photoshop.

Проблема в том, что Photoshop хранит данные JPEG CMYK в PDF/EPS, используя «нормальные» значения, тогда как в автономных JPEG он хранит инвертированные значения. Таким образом, когда потоки DCTDecode извлекаются побайтно и записываются на диск, результирующие файлы JPEG выглядят инвертированными.

(Фактическое извлечение выполняется собственной утилитой, которая просто извлекает байты из потока DCTDecode и записывает их без изменений в файл, оканчивающийся на . Это в основном .jpgдвоичное копирование и вставка. PDF-файлы доступны для повторного использования. процесса, если это потребуется.)

Поскольку изображения должны оставаться в формате JFIF, есть ли способ поместить маркер в извлеченный .jpgфайл, чтобы Photoshop открыл его с правильной кодировкой? Процесс должен быть без потерь (не включать дальнейшее энтропийное кодирование).

Файлы JPEG уже содержат APP14маркер, и его удаление не имеет никакого эффекта.

Ниже цитата из libjpegдокументации:

«... кажется, что Adobe Photoshop записывает инвертированные данные в файлы CMYK JPEG: 0 представляет собой 100% покрытие чернилами, а не 0% чернил, как вы ожидаете. ... Photoshop 3.0 [и новее]... записывайте неинвертированные YCCK. в файлах EPS/JPEG... (Но полярность данных, используемая в чистых файлах JPEG, не изменится...)"

Разве вы не можете просто автоматизировать пакетное преобразование экспортированных файлов JPEG обратно в обычную кодировку CMYK? Почему вам нужно помечать извлеченные файлы - вы говорите, что все PDF-файлы были созданы в Photoshop?
Как вы извлекаете JPEG из PDF? У вас уже есть папка, содержащая множество файлов JPEG, которые нужно конвертировать? Было бы хорошо добавить эту информацию в ваш исходный вопрос.
Если вы программно извлекаете данные JPEG, можете ли вы одновременно автоматизировать необходимые арифметические операции со значениями цвета? Не уверен, насколько это легко. Да, вы правы, мне действительно было интересно, контролировали ли вы процесс извлечения или просто должны были обрабатывать его вывод.
@unsigned: если значения цвета хранятся как числа с плавающей запятой, могут быть большие ошибки, но если они хранятся как целые числа, то их инвертирование не должно быть таким проблематичным. Я чувствую, что вы упустили часть рабочего процесса в своем вопросе. Обратите внимание, однако, что CMYK поддерживается не форматом JPEG, а JPG2000. Я не знаю, имеет ли это значение для вашего выбора библиотек...
Я имею в виду исходный стандарт JFIF, который поддерживает 1 или 3 цвета (24 бита). Отсутствие поддержки CMYK было исправлено в более позднем стандарте. Раньше это было проблемой, когда люди создавали jpeg из источников CMYK и пытались использовать их на веб-сайтах. Что касается рабочего процесса, вы возражали против предложения e100 использовать пакетную автоматизацию. Фотошоп поддерживает это. Если цвета просто инвертированы, то Photoshop может запустить пакетный процесс, такой как «открыть, инвертировать, сохранить как» для произвольного количества файлов.
Я совсем не упустил момент. Вы по-прежнему не предоставили никакой информации о том, какой инструмент вы используете для извлечения изображений, а также о том, исправлены ли изображения как группа (уже извлечены), вы не предоставили никакой информации о том, можете ли вы вернуться к PDF-файлам, чтобы повторно извлеките, и вы не указали, нужен ли вам конечный результат в формате JFIF. Я упомянул несколько вещей, которые могут вызвать проблемы, такие как устаревшие или неполные библиотеки и т. д. Документы, которые вы цитируете, относятся к 90-м годам и говорят о Photoshop 3 в будущем времени. Образец изображения также может быть полезен.
Вам нужно добавить массив декодирования «0 1 0 1 0 1 0 1», чтобы переназначить все каналы. Где вы его добавляете? Я понятия не имею. Может быть, к внутреннему экстрактору изображений или к jpeg в PDF.

Ответы (3)

Здесь на форумах Adobe такая же проблема с успешными результатами: http://forums.adobe.com/message/4271028

Может тег APP14 не правильный? В тегах APP14 есть нечто большее, чем просто наличие. О тегах JPEG: http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/JPEG.html#Adobe

JPEG теги Adobe

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

╔════════╦══════════════════╦══════════╦════════════════════════════════════════════╗
║ Index2 ║     Tag Name     ║ Writable ║               Values / Notes               ║
╠════════╬══════════════════╬══════════╬════════════════════════════════════════════╣
║      0 ║ DCTEncodeVersion ║ N        ║                                            ║
║      1 ║ APP14Flags0      ║ N        ║ Bit 15 = Encoded with Blend=1 downsampling ║
║      2 ║ APP14Flags1      ║ N        ║                                            ║
║      3 ║ ColorTransform   ║ N        ║ 0 = Unknown (RGB or CMYK)                  ║
║        ║                  ║          ║ 1 = YCbCr                                  ║
║        ║                  ║          ║ 2 = YCCK                                   ║
╚════════╩══════════════════╩══════════╩════════════════════════════════════════════╝

Но это может не помочь, я помню, как кто-то заявил, что эти частные маркеры не предназначены для руководства PDF-Readers, но должны быть правильными массивами декодирования.

Магия, кажется,

/Декодировать 0 1 0 1 0 1 0 1

который инвертировал бы цветовое отображение. (Я предполагаю, что это флаг в libjpeg, что-то подобное должно быть доступно в любом подобном инструменте.) Массивы декодирования распространены в PDF-файлах в соответствии со ссылкой на PDF здесь: http://partners.adobe.com/public/developer/en/pdf /PDFRReference.pdf

Я понятия не имею, можете ли вы добавить эти массивы декодирования в PDF JPEG или вам нужно добавить это к потоковой обработке вашего внутреннего инструмента. У меня нет примера PDF для работы, поэтому я не могу проводить дальнейшие исследования (кроме того, ссылка огромна - tl; dr - но вам, возможно, придется ..)

Это помогло мне правильно отобразить Photoshop CMYK JPEG, встроенный в PDF. Мне пришлось установить /Decodeэлемент словаря Image XObject в [1 0 1 0 1 0 1 0].
Это также помогло мне, и я могу убедиться, что CMYK JPEG, которые были инвертированы, теперь отображаются правильно. Для меня RGB это не нужно ... У меня есть один вопрос, однако, будет ли это верно для ВСЕХ изображений CMYK, а не только для некоторых? Кроме того, будет ли это (всегда) печатать правильно? (таким образом, не только для экрана)
@BrechtMachiels Где вы это устанавливаете? Можно ли это сделать с помощью простого hex-редактора?
@Thomas Я столкнулся с этим при попытке встроить CMYK JPEG в PDF-файл, созданный моим приложением, которое создает PDF-файл с нуля (ищите ссылки на Adobe на github.com/brechtm/rinohtype/blob/master/src/rinoh/backend/ pdf/… , Для существующего PDF, если /Decodeэлемент присутствует, вы можете поменять местами 0 и 1. Я не смог угадать, каков ваш вариант использования, но если вы извлекаете JPEG из PDF, я думаю инструмент извлечения действительно должен справиться с этим ...
@BrechtMachiels, который я использую pdfimagesдля извлечения изображений из PDF. В некоторых случаях файлы JPG инвертируются. Я мог бы изменить байты в этих файлах, но не знаю, где найти эту \Decodeчасть. Я до сих пор не понимаю, это параметр для инструмента или фрагмент данных внутри JPG...
@Thomas (извините, я вижу только ваш комментарий сейчас) Это может быть ошибка в pdfimages (poppler): gitlab.freedesktop.org/cairo/cairo/-/issues/156 . Или в инструменте, создавшем PDF... Это /Decodeесть (вернее, может быть) в PDF. Вы можете попробовать поменять местами 0 и 1 в PDF перед запуском pdfimages, если элемент /Decodeприсутствует. Кроме того, вы можете добавить (или удалить) APP14 из извлеченного PDF-файла. Если вы можете поделиться PDF, я могу попытаться быстро посмотреть для вас.

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

Проблема, скорее всего, связана с отсутствием профиля ICC.

Чтобы встроить (или преобразовать) такой профиль, вы можете использовать f.ex. ImageMagick, чтобы сделать эти файлы потерь, не затрагивая данные.

ImageMagick:
http://imagemagick.org/script/index.php

Утилита командной строки может использоваться для встраивания профиля ICC:

convert cmyk.jpg -profile USWebCoatedSWOP.icc cmyk_w_icc.jpg

При желании конвертируйте его в собственное цветовое пространство RGB.

Подробнее см. здесь:
http://www.imagemagick.org/Usage/formats/#color_profile

Профили ICC можно загрузить отсюда:
http://www.adobe.com/support/downloads/detail.jsp?ftpID=4074 .

Вы можете инвертировать цвета с помощью ImageMagick :

convert input.jpg -negate output.jpg

Результат выглядит хорошо, но он может быть не без потерь. По крайней мере, в некоторых случаях размер файла кажется значительно меньше.