Уровни RGB в Photoshop с помощью ImageMagick

Я пытаюсь преобразовать некоторые эффекты, созданные в Photoshop, в код для использования с php / imagemagick. Прямо сейчас меня особенно интересует, как воссоздать функцию уровней RGB в Photoshop. Я не очень знаком с интерфейсом Photoshop, но это информация, которую мне дают:

RGB Level Adjust
  Input levels: Shadow 0, Midtone 0.92, Highlight 255
  Output levels: Shadow 0, Highlight 255

Какова точность входных уровней по сравнению с выходными? Как бы я перевести это в ImageMagick? Ниже вы можете увидеть, что я пробовал, но это не правильно отображает желаемый эффект (преобразование масштаба 0-255 в Photoshop в 0-65535):

$im->levelImage(0, 0.92, 65535);
$im->levelImage(0, 1, 65535);

Это был в основном удар в темноте, поскольку имена параметров не совпадают, а для выходных уровней количество параметров даже не совпадает. По сути, я не совсем понимаю, что происходит, когда фотошоп применяет настройку. Я думаю, что это мое самое большое препятствие прямо сейчас. Как только я это получу, мне нужно будет найти соответствующие эффекты в ImageMagick.

Может кто-нибудь пролить свет на то, что происходит в Photoshop и как воспроизвести это с помощью ImageMagick?

 Ani22 мая 2012 г., 22:38
Я не уверен, что он хочет получить разъяснения по использованию API настолько, насколько он хочет понять, как воспроизвести эффект Photoshop, используя его.

Ответы на вопрос(3)

Midtones и Highlights - это цвета, которые попадают в определенный диапазон яркости. Например, тени - это нижний диапазон гистограммы яркости, средние тона - это цвета в середине, а блики - те, что находятся высоко. Однако вы не можете использовать жесткий предел для этих значений, поэтому вам придется использовать такие кривые, которые взвешивают гистограмму (пиксель может находиться в нескольких диапазонах одновременно).

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

Я не думаю, что вы можете сделать это напрямую с помощью API ImageMagick - возможно, вы могли бы просто написать это как фильтр.

Надеюсь это поможет

 Maksim Sorokin12 дек. 2012 г., 20:57
Насколько я понимаю, тени и блики - это параболы, верно? Но какова будет формула этого?
 Ani12 дек. 2012 г., 23:04
@ МаксимСорокин Нет - они гауссианцы En.wikipedia.org / вики / Gaussian_function) соответствующим образом масштабируется и переводится.
Решение Вопроса

http: //www.fmwconcepts.com/imagemagick/levels/index.ph

Основываясь на полученной там информации, я смог придумать следующий php, который кажется довольно эффективным для имитации того, что Photoshop делает с вводом и выводом и всем этим.

function levels($im, $inshadow, $midtone, $inhighlight, $outshadow, $outhighlight, $channel = self::CHANNEL_ALL) {
    $im->levelImage($inshadow, $midtone, $inhighlight, $channel);
    $im->levelImage(-$outshadow, 1.0, 255 + (255 - $outhighlight), $channel);
}

Это предполагает, что параметры levelImage для черной точки и белой точки находятся в масштабе 0-255. На самом деле они могут быть 0-65535 в вашей системе. Если это так, это достаточно просто отрегулировать. Вы также можете проверить, какое значение использует ваша установка, с помощью $ im-> getQuantumRange (). Он вернет массив с строковой версией и длинной версией кванта. Оттуда должно быть достаточно просто нормализовать значения или просто использовать новый диапазон.

 gregghz15 мар. 2013 г., 01:59
$ im - объект IMagick (в него должно быть предварительно загружено изображение). Просто примените код, который вы видите выше, к своему изображению IMagick.
 Ravean13 авг. 2014 г., 20:38
Кто-нибудь может объяснить, как допустимо значение - $ outshadow? Я понимаю, что входные значения для levelImage должны быть между 0-255, что происходит с отрицательным значением? Кроме того, значение outhighlight (255 + (255 - $ outhighlight)) всегда будет 255 или выше? Еще раз я думал, что levelImage хочет значение между 0-255?
 Panama Jack14 мар. 2013 г., 21:52
У тебя был бы полный рабочий пример? Или как код наносится на изображение? Это то, что мне нужно.
 alphablender21 авг. 2012 г., 00:17
любой способ реализовать это в GD?

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

Выходные значения фиксируются на квантовых значениях типа изображения, указывать их не нужно.

 gregghz22 мая 2012 г., 22:38
Ты прав, это не очень наглядно. Но это было сделано намеренно, так как я надеюсь на индивидуальное сопоставление фотошопа с магией изображений. Я подозреваю, что это маловероятно. Так что если бы вместо этого, я был бы в восторге от ресурсов, чтобы понять, как работают уровни rgb в Photoshop, чтобы я мог получить знания низкого уровня для правильной (а не просто бесцельной) настройки для достижения желаемых результатов.
 Mark Ransom22 мая 2012 г., 21:00
@ greggory.hz «не дает одинаковых результатов» не очень наглядно. Помогите нам помочь вам.
 gregghz22 мая 2012 г., 20:53
Посмотрите, но это более или менее то, что я пробовал, и это не дает такие же результаты, как в Photoshop
 Mark Ransom22 мая 2012 г., 22:50
@ greggory.hz, я не использую ни Photoshop, ни ImageMagick, но знаю достаточно об основах, чтобы дать правильный ответ, если бы я не работал вслепую. На основании имеющейся у меня информации, либо$im->levelImage(0, 0.92, 65535); или$im->levelImage(0, 0.92, 255); должен быть в точности эквивалентен Photoshop. Если это не так, скажите, пожалуйста, как далеко.
 Ani22 мая 2012 г., 22:39
@ greggory.hz Посмотрите мой ответ выше, он нацелен именно на это.

Ваш ответ на вопрос