Скриншот из топика "Модули CMM, RI, совместимость с Photoshop" крохотного фрагмента обычной огромной таблицы. Гранулярность CLUT матрицы, равная 33. Первые три столбца любезно подставил wxProfileDump, в профиле их нет, но модули CMM верно прочитают данные четырех столбцов CMYK в той же разметке Lab
- Если выставлено Perceptual в Rendering Intent, то по умолчанию преобразование в PCS производится по данным AToB0Tag? (в препарируемом примере все AToB одинаковые - AToB1Tag, AToB2Tag: SameAs="AToB0Tag")
Обычно традиционно почему-то принято указывать дефолтным в профилях перцепционный RI. Но использоваться будет тот, который будет указан в программе, применяющей профиль. Видимо дефолтный вариант внутри профиля на тот необычный случай, когда программа забудет спросить пользователя, какой способ колориметрического преобразования профиля задействовать.
И это распространенная практика, чтобы не плодить сущности, ставить в валидном профиле ссылки от одних таблиц к другим. Если перцепция по расчетам производителя профиля ничем не отличается от относительного колориметрического рендеринга и от неколориметрического Saturation, всегда лучше не просто проигнорировать таблицы, так профиль будет невалидным, а указать в заголовках дублирующих таблиц, что данные для них лежат там-то и там-то, в разбираемом примере на перцепционный тег AToB0Tag ссылаются валидно как на собственный все три разных рендеринга.
То что нет абсолютной колориметрической таблицы в подавляющем большинстве профилей, оправдано спецификацией ICC. Абсолютная колориметрическая таблица всегда вычисляется из относительной колориметрической с использованием белой точки из тега <mediaWhitePointTag> по формулам ICC (28 страница). У меня в софте рилейтив в абсолют и абсолют в рилейтив также вычисляется. Эти же функции ICC задействованы в цветовом конвертере для красок CMYK по фогре 39 в рилейтиве или абсолюте.
Мы все освоили iccMax для преобразования icc в читаемый редактируемый формат xml и обратную последующую упаковку xml в icc. Поэтому если мы, например, встречаемся с неким рипом, управляющим софтом для печати, который по каким-то причинам отказывается использовать например релативный рендеринг профиля и всегда использует перцепционный, а нам надо все наоборот, то нет ничего проще как поменять местами заголовки AToB0 и AToB1 перцепционного и релативного тега, и программа будет считать, что за рилейтив отвечает перцепция а за перцепцию рилейтив изначальные.
- InputEntries="1024" OutputEntries="256".
В каждой кривой содержится всего 1024 значений, но если для точки нужно два значения, значит должно быть 1024 x 2? Если на входе кривая 1024 значения и на выходе 256 значений, то не происходит нежелательная потеря данных при конвертации в PCS XYZ?
Далее смотрим на кривые с разным числом степов. Структура тегов профиля такова, что каждый тег преобразования в ту или обратную сторону должен содержать три элемента: кривые на входе в тег, CLUT или таблицы, кривые на выходе из тега. Иногда не все три задействуются в полной мере, любая из кривых на входе или выходе может быть просто линейной, любая матрица CLUT может быть просто "заглушкой", обманкой, то что программисты называют cap латинскими буквами, не исполнять никаких серьезных действий и быть просто линейной. Так делается для того, чтобы профиль оставался валидным по структуре. Что означают эти три части тега преобразования например AToB0. На входе мы имеем некие RGB. Первые кривые могут их исказить нелинейно перед подачей на CLUT. В разбираемом примере так все и происходит, кривыми на входе в тег применяется гамма-коррекция, причем со знакомой гаммой sRGB. Далее эти предыскаженные данные поступают на CLUT - табличное преобразование из RGB в XYZ. Тут мы видим в разбираемом примере, что стоит линейная CLUT-заглушка, которая просто присваивает крайним RGB-значения их XYZ-значения. Такое не часто встретишь, обычно кривые ничего не делают, а огромная матрица CLUT очень даже работает во всю. Но тут вот так все просто, простейший CLUT с минимумом необходимых данных, ничего нелинейного; так порой делают в калибровочных девайс-линках, где нужен только CLUT-обманка, заглушка для валидности, всю работу выполняют только кривые, а на входе и выходе из CLUT одно и то же. И третья часть тега - на выходе другие кривые уже предыскажают три канала XYZ. Идея понятна: на входе в тег мы можем кривыми поправить или оставить линейными сигналы RGB, на выходе - поправить или оставить линейными сигналы XYZ. С CMYK и Lab все то же самое. Каждый тег обязан иметь в арсенале все три преобразования curves-CLUT-curves, и он их имеет. Даже если какие-то из них ничего собственно не делают, отдают линейные данные. Эта особенность уже затрагивалось в теме Особенности Device Link профайлов (DLP). И препарируемом примере на выходе просто 256 линейных значений, в принципе эту часть можно было бы сократить и до 2 линейных значений, но видимо в профайлере оставлен программистами задел на тот случай, если потребуются нелинейные вмешательства кривыми в координаты XYZ. При использовании профилей происходят интерполяции любых кривых и CLUT профиля, и там где важна точность повыше - там 1024 точки на кривой или более, там где речь просто о линейной заглушке валидности - вполне хватит и 2 и конечно 256 точек на абсолютно ровной прямой.
В обратном направлении преобразования BToA из PCS XYZ в каналы RGB и кривые задействуются в обратном порядке. Вначале на входе линейные XYZ не подвергаются воздействию кривых, а вот после CLUT-преобразования, на выходе - уже RGB значения подвергаются воздействию зеркальной, обратной кривой тегу AToB тонопередающей функции.
- С обсуждаемым профилем у меня в печати все желтит даже на синей бумаге. От чего?
Белая точка нетипичная D65 в данном профиле, профили печати все как на подбор с белой точкой D50. Но стандарт sRGB - это D65, вот тут и совмещали ежа с ужом не совсем корректно.
Препарируемому профилю не хватает только тега хроматической адаптации CHAD от D65 к D50, белая точка необычная D65 для <ProfileDeviceClass>prtr - описания профилем принтера. CHAD кстати есть в подобных профилях sRGB от ICC (тут было немного подробностей).
- Обязательно ли нужно объявлять кривую без преобразований?