nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Вспомогательные фрагменты PNG (продолжение)

Основная причина, почему я полез разбираться в этих данных - колориметрия. Некоторым действиям графического редактора совершенно неважно, что подразумевается под значениями RGB, скажем, на обрезку изображения или на его поворот на 90 или 180 градусов это никоим образом не влияет. Но уже поворот на произвольный угол требует интерполяции отсчетов цветности, а в этом случае правильно будет прийти к линейным откликам, каковыми значения R,G,B, как правило не являются. В простейшем случае нам хватило бы одного коэффициента "гамма", но при наличии ICC-профиля нужно будет прибегнуть к Tone Response Curve (TRC), по одной на каждый цвет, а в самых тяжелых случаях - к CLUT (Color Look-Up Table).

iCCP.png

Другая частая операция, которую по-хорошему надо привязать к колориметрии - это преобразование в Ч/Б. В сети можно найти много формул для правильного нахождения яркости, начиная с (R+G+B)/3 и множество вариаций на тему 0.2989R+0.5870G+0.1140B, но если в картинке содержится колориметрическая информация, самым корректным будет воспользоваться ей.

В PNG за колориметрию отвечает аж 4 разных фрагмента, про гамму (gAMA) мы уже говорили в прошлый раз, а сейчас обсудим еще 3: cHRM (Chromaticity), sRGB и iCCP (ICC Profile).


cHRM (Chromaticity)
В этом фрагменте указываются цвета R,G,B и белого (255;255;255) в цветовом пространстве CIE1931 XYZ, еще точнее, приводятся значения x,y, т.е одна лишь цветность без яркости. Эта информация, в совокупности с гаммой, вполне себе тянет на цветовой профиль, по крайней мере профиль sRGB устроен именно так - в нем содержится матрица перехода от RGB к XYZ и одна на троих кривая Tone Response Curve, та самая гамма.

Мой PNGRepack умеет считывать данный фрагмент и показывать его в удобоваримом виде, но мне так и не довелось это хоть разок испытать - ни в одном из PNG файлов на моем компьютере cHRM не содержался. Это очень грустно, т.к снова нарушаются рекомендации - по спецификации (http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html#C.sRGB), при наличии sRGB chunk следует также добавить gAMA = 1/2.2 и cHRM, которые соответствуют профилю sRGB - чтобы "более простые" просмотрщики, не понимающие sRGB, могли бы понять более простые gAMA и сHRM. Но, как видно, gAMA все повально кривые, а cHRM отсутствует как класс...

sRGB (standart RGB)
Фрагмент длиной 1 байт, а мог бы иметь размер 2 бита, если бы это было позволено. В первую очередь, он говорит о том, что в изображении используется цветовое пространство sRGB IEC 61966-2-1, а в указанные 2 бита помещен Rendering Intent ("способ отображения"), возможные значения: relative colorimetric, perceptual, saturation, absolute colorimetric.

sRGB.png

Absolute colorimetric никогда не тронет цвет, который устройство способно отобразить, а остальные будут округлены до ближайшего отобразимого, при этом области с плавными переливами могут вдруг стать сплошными, как тот чистый спектр (http://nabbla1.livejournal.com/64537.html) в верхнем ряду. Такой способ рекомендуется выставлять только для всяческих калибровочных изображений.

Relative colorimetric пересчитывает цвета под "другой белый" цвет, имея в виду, что человеческий глаз довольно быстро привыкает к другому освещению и все цвета уже воспринимает относительно него.

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

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

Фрагмент sRGB появляется в PNG-файлах довольно часто, мне встречался rendering intent: relative colorimetric и perceptual. Paint.Net лепит его во все файлы, причем дополняет его дважды кривым gAMA=2.4 (UPD. Была ошибка в чтении гаммы, на самом деле там 0.45, почти верно).

iCCP (ICC Profile)
Тут у нас целый профиль ICC, сжатый нашим любимым zlib и помещенный в изображение. Я почти научился их прочитывать, по крайней мере, sRGB он прочитывает целиком, осталось только научится считывать теги типа mAB и mBA - там навертели так навертели, матрица, кривые входные, кривые выходные, многомерная таблица...

Абсолютный рекордсмен среди профилей - sRGB, одного и того же размера, 3144 байта, одного года выпуска, но с немножко разными данными, не пойму, почему. Где-то в половине файлов конец Tonal Response Curve (TRC) выглядит так:

iCCP2.png

(Тут есть некий финт ушами - таблицы объявлено 3, по одной на каждую компоненту цвета, но они все ссылаются на одно и то же место в профиле, на что PNGRepack и указал, записав gTRC = rTRC и bTRC = rTRC)

Но еще половина выглядит так:
iCCP1.png

Что-то произошло с окончанием таблицы, часть данных перемешалась, а самое окончание как будто бы совсем затерлось. Как это получилось, проблема ли на кодирующей стороне или тут и у меня какой странный баг выплыл - не знаю пока.

Единственный профиль, не совпадающий с sRGB - некий эппловский generic RGB:

iccp3.png

Страшный mluc - это всего-то multiLocalizedUnicodeType, а вот название тега в документации не фигурирует. Получается, собрался такой большой консорциум, утвердили стандарт, и Apple там присутствовала, но потом все равно решила сделать всё по-своему. А ниже идут вполне себе обычные rTRC, bTRC и bTRC, cprt (copyright) и другие теги, вот только их типы не отмечены по-нормальному. Все-таки Apple и правда мыслят по-другому, возможно и в личной жизни.


Осталось мне научиться колориметрические теги из TIFF взаимно-однозначно переписывать в PNG и назад, и смогу с чистой совестью зарелизить альфа-версию PNGRepack.


Окончание следует (tRNS, bKGD, sPLT, hIST, OFFs, sCAL, pCAL, sBIT, надеюсь, никого не забыл)
Tags: scancombine, программки
Subscribe

  • А всё-таки есть польза от ковариаций

    Вчера опробовал "сценарий", когда варьируем дальность от 1 метра до 11 метров. Получилось, что грамотное усреднение - это взять с огромными весами…

  • Потёмкинская деревня - 2

    В ноябре 2020 года нужно было сделать скриншот несуществующей программы рабочего места под несуществующий прибор, чтобы добавить его в документацию.…

  • Очередная несуразность в единицах измерения

    Когда-то я написал программу PhysUnitCalc - калькулятор, умеющий работать с размерностями. Мне казалось, что я наступил уже на все грабли, которые…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 2 comments