Информация о профиле декодирования PIL/Pillow icc

Я застрял в декодировании/анализе информации ICC-профиля, извлеченной с помощью PIL.

Ниже тестовое изображение, содержащее профиль «Adobe RGB (1998)».

# download the test image:
wget http://i.stack.imgur.com/62AHB.jpg

-

from PIL import Image
path = '62AHB.jpg'
icc = Image.open(path).info.get('icc_profile') 

Пока все хорошо, но я не смог найти способ обработки возвращенной информации ICC.

Приведенный выше пример вернет:

'\x00\x00\x020ADBE\x02\x10\x00\x00mntrRGB XYZ\x07\xcf\x00\x06\x00\x03\x00\x00\x00\x00\x00\x00acspAPPL\x00\x00\x00\x00none\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\xf6\xd6\x00\x01\x00\x00\x00\x00\xd3-ADBE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ncprt\x00\x00\x00\xfc\x00\x00\x002desc\x00\x00\x010\x00\x00\x00kwtpt\x00\x00\x01\x9c\x00\x00\x00\x14bkpt\x00\x00\x01\xb0\x00\x00\x00\x14rTRC\x00\x00\x01\xc4\x00\x00\x00\x0egTRC\x00\x00\x01\xd4\x00\x00\x00\x0ebTRC\x00\x00\x01\xe4\x00\x00\x00\x0erXYZ\x00\x00\x01\xf4\x00\x00\x00\x14gXYZ\x00\x00\x02\x08\x00\x00\x00\x14bXYZ\x00\x00\x02\x1c\x00\x00\x00\x14text\x00\x00\x00\x00Copyright 1999 Adobe Systems Incorporated\x00\x00\x00desc\x00\x00\x00\x00\x00\x00\x00\x11Adobe RGB (1998)\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00XYZ \x00\x00\x00\x00\x00\x00\xf3Q\x00\x01\x00\x00\x00\x01\x16\xccXYZ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00curv\x00\x00\x00\x00\x00\x00\x00\x01\x023\x00\x00curv\x00\x00\x00\x00\x00\x00\x00\x01\x023\x00\x00curv\x00\x00\x00\x00\x00\x00\x00\x01\x023\x00\x00XYZ \x00\x00\x00\x00\x00\x00\x9c\x18\x00\x00O\xa5\x00\x00\x04\xfcXYZ \x00\x00\x00\x00\x00\x004\x8d\x00\x00\xa0,\x00\x00\x0f\x95XYZ \x00\x00\x00\x00\x00\x00&1\x00\x00\x10/\x00\x00\xbe\x9c'

Как расшифровать эту информацию?

Кажется, внутри данных есть какие-то ключи. В основном мне просто нужно значение для "desc", которое в этом случае равно "Adobe RGB (1998)".

Есть идеи? Ждем ваших отзывов :) !

«Тестовое


person ohrstrom    schedule 06.08.2015    source источник
comment
Похоже, что там есть загрузка нулевых байтов и ACK среди прочего, вы можете использовать регулярное выражение для извлечения информации   -  person Padraic Cunningham    schedule 07.08.2015
comment
Это очистит его b" ".join(x for x in icc["icc_profile"].split(b"\x00") if x)   -  person Padraic Cunningham    schedule 07.08.2015
comment
Мне нравится этот пример изображения, навевает приятные воспоминания об ушедших временах... :-)   -  person Jens    schedule 17.05.2016


Ответы (3)


Я пишу это также для людей, которые пришли сюда в поисках информации о том, как обрабатывать информацию о цветовом профиле ICC в Python.

Pillow fork исходной библиотеки PIL для Python включает модуль ImageCms. К сожалению, конструктору профиля требуется имя файла или файлоподобный объект, поэтому мы должны сделать это сбоку через io.BytesIO

import io

from PIL import Image
from PIL import ImageCms

image = Image.open('/tmp/DQ-Tool_Print_13x18cm.jpg')
icc = image.info.get('icc_profile')
f = io.BytesIO(icc)
prf = ImageCms.ImageCmsProfile(f)

Теперь prf содержит экземпляр цветового профиля. Взгляните на документы здесь: https://pillow.readthedocs.io/en/stable/reference/ImageCms.html#PIL.ImageCms.CmsProfile

person Arminius    schedule 21.08.2017

Мне неизвестен специальный модуль Python, который может обрабатывать цветовые профили ICC.

Если вы готовы к приключениям, ознакомьтесь с разделом 6 Требования ICC. Спецификация формата профиля. Это должно помочь вам начать интерпретировать байты.

Однако тестовая папка Pillow содержит два профиля ICC, так что, возможно, это стоит копаясь в коде некоторых из их тестов. Вы также можете посмотреть этот ответ, который относится к Little CMS, который, кажется, имеет некоторые Поддержка профиля ICC.

person Jens    schedule 16.05.2016
comment
Спасибо за предложение. В конце концов мы решили эту проблему, используя внешний инструмент exiftool и извлекая информационную форму icc. вызов подпроцесса. - person ohrstrom; 06.06.2016

Я знаю, что эта проблема уже решена, но я просто добавляю это, потому что это может быть полезно людям, которые ищут способ извлечь информацию о профиле ICC в Python.

В рамках программы jpylyzer (главным разработчиком которой я являюсь) я однажды написал код Python для извлечение основных полей заголовка профиля ICC (это полностью независимо от каких-либо внешних библиотек). См. функцию validate_icc ниже:

https://github.com/openpreserve/jpylyzer/blob/master/jpylyzer/boxvalidator.py#L598

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

person johan    schedule 07.07.2016
comment
Спасибо за информацию. чтобы мы знали, где искать в следующий раз :) - person ohrstrom; 07.07.2016