Dmitry Leonov (leonov) wrote,
Dmitry Leonov
leonov

Category:

дорогая цветопередача

На выходных наконец-то дошли руки до того, чтоб закрыть оставшиеся косяки с цветопередачей нового монитора. Во первых строках поста, конечно, хочется передать отдельный привет виндовой системе управления цветами (ICM). Чтобы воспользоваться цветовым профилем, хоть стандартным от монитора, хоть полученным в результате калибровки, нужно выполнить аж три условия.

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

Во-вторых, загрузить его в LUT монитора (если он такое понимает, как NECовская тридцатка) или видеокарты (в случае Dellовской тридцатки), в последнем случае это нужно проделывать при каждом старте системы. Причем диалоги UAC от висты и от семерки все нафиг сбрасывают (еще один повод избавляться от UAC), хорошо хоть в семерке появилась возможность отключать затемнение экрана, переключение в которое и дает такой эффект. Кстати, в семерке появилась возможность загрузки профиля штатными средствами, уже прогресс - раньше для этого приходилось пользоваться внешними загрузчиками (галочка Color Management->Advanced->Change system defaults->Advanced->Use Windows display calibration, есть шанс, что это отразится и на сбросе от UAC, уже неохота проверять).

Эффект от загрузки профиля уже вполне заметен, но и это еще не все. Финальный штрих - прикладная программа должна быть в курсе того, какой профиль выбран в системе, и при выводе проводить преобразование из цветового пространства медиафайла в системное (хорошо бы при этом считывать информацию из самого файла, но на худой конец сойдет и расчет на то, что там sRGB). Хорошая демонстрация того, что бывает при игнорировании информации из файлов, есть тут; в браузерах, не признающих ICM, наиболее нагляден пример из раздела "Why is color management important".

Для обычных мониторов последнее условие в основном важно при работе с фотографиями, на мониторах же с так называемым расширенным цветовым охватом (wide gamut), к которым относятся обе упомянутые тридцатки, это становится актуально везде (за подробностями - сюда, если на пальцах, то в противном случае все выглядит примерно как при задирании saturation). Я не очень понимаю, почему за те почти 15 лет, что прошли после появления ICM в Windows'95, никому в Microsoft не пришло в голову избавить пользователей от этого геморроя, дав общесистемную настройку, обеспечивающую для программ, слыхом не слыхавших про ICM, хотя бы дефолтовое преобразование sRGB->монитор. Но что имеем, то имеем, а поведение UAC, не изменившееся в семерке, лишь демонстрирует, в каком загоне тут работа с цветами.

Итого, для адекватной передачи цветов на мониторах с wide gamut выбор прикладных программ становится жизненно важным. В случае фото или веба все тривиально. Фотошоп, Lightroom и стандартный просмотрщик висты/семерки о всех этих заморочках в курсе и подхватывают все на ура, у ACDSee и FastPictureViewer есть подходящие настройки. IrfanView грозится обеспечить полную поддержку ICM со следующей версии, пока же от него пришлось отказаться. На вебе выбор невелик - сафари или третий FF (можно поставить плагин, можно в about:config врубить фильтрацию по gfx.color и поменять пару свойств, эффект будет тот же) - кстати, советую это сделать и заценить разницу с IE или на упомянутой выше странице, или тут.

С видео же полный швах - насколько я понял, практически все медиаплейеры просто игнорируют работу с цветами. Конечно, ixbtшная ветка по деллу полна восторгов о ярких цветах, но лично для меня веселый загар большинства персонажей большинства фильмов, переходящий в нездоровый румянец, кислотный зеленый цвет травы и прочие прелести расширенного охвата (а уж во что превращаются стартрековские красные униформы - просто непередаваемо) - вовсе не то, о чем мечталось. К счастью, небольшой поиск привел на страницу с описанием грязного хака, позволяющего подхватить ICC-профиль в Media Player Classic - через редактирование шейдеров (раздел "4. Experimental colour correction in Media Player Classic"). Проверил, результат вполне удовлетворителен. Единственный подводный камень - при переносе полученного шейдера нужно учесть, что в системе с русской локалью запятые в числах нужно заменить на точки. Кроме того, чтобы при просмотре через VMR9 черный цвет выглядел как черный, а не темно-серый, стоит подправить первую строчку функции main этого шейдера, позаимствовав код из шейдера "16-235 -> 0-255".

Окончательный вариант для моих настроек выглядит так:

sampler s0 : register(s0);
float4 p0 : register(c0);

static float4x4 r2r =
{
0.701797172201328,0.31522478186818,-0.0170219540695086,0,
0.0424436523871912,0.948910562083758,0.00864578552905135,0,
0.0112113910919667,-0.0114383758869162,1.00022698479495,0,
0, 0, 0, 0
};

#define Const_1 (16.0/255.0)
#define Const_2 (255.0/219.0)

float4 main(float2 tex : TEXCOORD0) : COLOR
{
    float4 c0 = ( tex2D( s0, tex ) - Const_1 ) * Const_2;
    c0 = pow(c0, 2.2);
    c0 = mul(r2r, c0);
    c0 = saturate(c0);
    c0 = pow(c0, 1/2.2);
    return c0;
}


Что особенно забавно: получается (из того, как это реализовано), что единственное, чего не хватает всем прочим программам после загрузки профиля в систему, - правильного выставления цветовых координат чистых цветов. Если б система могла использовать эти 9 чисел самостоятельно, не пришлось бы рыть носом в поисках правильных программ.

Tags: софт, цацки
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 0 comments