Итак, профиль сканера худо-бедно построен, мало того, я научился встраивать его в PNG-файл. Как ни странно, стандартные просмотрщики Windows (пробовал на XP и семёрке) его поняли и изобразили картинку с его учетом. Также его благосклонно воспринял Photoshop CS6 - на экране файл отобразился качественно, и потом в Edit -> Convert to profile... я выбрал sRGB и тем самым уже преобразовал непосредственно пиксели. Сейчас я покажу вам именно эти картинки, поскольку их любой браузер должен отобразить "предсказуемо", близко к истине.
Без цветового профиля:
С профилем:
Больше всего заметна гамма-коррекция (сканер внезапно решил мне выдать линейный отклик по всем 3 каналам!), но кроме того, цвета стали более насыщенными. Оба этапа подробнее показаны под катом.
Кроме внедрения ICC-профиля, я решил также добавить Chunk'и (фрагменты, блоки) gAMA (гамма-коррекция) и cHRM (Chromaticity, цветность) - это некий "профиль для бедных", который по идее проще применить, чем ICC, поэтому возможен вариант, когда браузер или другая программа не поймут ICC-профиль, но воспользовавшись gAMA и cHRM, изобразят картинку почти как надо.
Как ни странно, стандартные просмотрщики Windows и эти данные воспринимают корректно. Вот файл, где отсутствует профиль, а задана лишь гамма, равная 1.02 (линейный отклик, в sRGB гамма 0.45). То, что я показываю здесь - это скриншот с просмотрщика. К сожалению, Photoshop CS6 об этой гамме понятия не имеет, ему профиль подавай!
А здесь мы кроме гаммы добавили ещё и cHRM, т.е тот самый треугольник из трёх базовых цветов сканера. Получилось так:
Предлагаю открыть эти три изображения (с профилем, с гаммой и с гаммой+цветностью) в новых вкладках и попереключаться взад-вперёд, поискать разницу. Мы увидим, что одна лишь коррекция гаммы оставляет блеклые цвета, что и понятно, если взглянуть на цветовую диаграмму - значениями R,G,B каждого пикселя отображается позиция относительно углов треугольника, но без информации о цветности мы по умолчанию отсчитываем точку относительно чёрного треугольника sRGB. Поэтому все точки у нас прижмутся ближе к центру, т.е станут менее насыщенными.
Когда же мы сравним файл с цветовым профилем и файл с гаммой и цветностью, то увидим - наконец-то у него появляются тёмные тона! Мы отчётливо видим разные цвета, не просто черноту, но здесь цвета более "глубокие" чем в файлах с гаммой и цветностью. Так происходит, потому что в цветовом профиле в кривых rTRC/gTRC/bTRC (red/green/blue Tone Response Curve) корректируется не только гамма, но и яркость с контрастностью. Оказывается, что сканнер настроен с небольшим запасом, и даже самые темные области не давали (0;0;0), а самые яркие не превышали (200;200;200). Построив кривые соответствия измеренных цветов эталонным, удаётся корректно растянуть диапазон.
Ещё меня волновали отрицательные значения компоненты Z в базовых цветах сканера. Я объяснял, что это совершенно нормальное явление, да и при разработке ICC чуваки явно такую ситуацию предусматривали, иначе применили бы беззнаковые числа. Однако, потом они по какой-то странной прихоти объявили, что Colorants (те самые базовые цвета) должны содержать исключительно положительные компоненты, иначе профиль не является Compliant и вообще любая уважающая программа должна брезгливо отбросить его в сторону, либо интерпретировать его так, как посчитает нужным.
И кто знает - может быть, эти программы на самом деле "округлили" отрицательные компоненты до нуля? Чтобы это проверить, я сам приравнял эти компоненты нулю в своём профиле и снова "скормил" файл фотошопу. Вот что получилось:
Опять же, чтобы заметить разницу, надо переключать вкладки. Обнаружим, что такой профиль с обнулёнными значениями Z - более "холодный". Та же разница чувствуется и если листать исходные файлы (без конверсии в sRGB) в просмотрщике, а значит, и он, и Photoshop обращаются с отрицательными значениями нормально.
И дополнительно под спойлером - исходные картинки. Повторю - все картинки, что я привёл выше - преобразованы в sRGB. А под спойлером - пиксели ровно те, которые выдал сканер, без каких-либо изменений, но к ним добавлена информация, что эти циферки означают. Что такое R,G,B, а также что такое 0 или 255, и чему равно среднее арифметическое между ними: 128 или 192? Далеко не все программы вообще обращают внимание на эту информацию (будь то ICC профиль или блоки gAMA/cHRM в PNG), а если обращают, то корректно.
Я пока не понял всей логики браузеров - они, открывая PNG-файл, реагируют одним способом, а внутри HTML-странички - другим, и не удивлюсь, если на них влияет ещё и CSS. Читал про ожесточенные споры, должен ли браузер заниматься управлением цветом, ведь для цветов на самой HTML-страничке долгое время нельзя было задать профиль (возможно, и сейчас нельзя, только sRGB), а тогда может быть неприятная ситуация - веб-дизайнер размещает у себя фотку, а чтобы она встраивалась в дизайн, подбирает цвет фона, тыкая по фотке пипеткой. А потом окажется, что у фотки был цветовой профиль, отличный от sRGB, и умный CMM все цвета поменяет при отображении, но не сможет сделать этого для фона, и дизайнер полетит со своего рабочего места на улицу. [Spoiler (click to open)] Без цветового профиля, только гамма (gAMA):
Без цветового профиля, гамма + цветность (gAMA + cHRM):