Вопрос по – Уровни 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?

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

![]()

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

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

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



 [http: //www.fmwconcepts.com/imagemagick/levels/index.ph](http://www.fmwconcepts.com/imagemagick/levels/index.php)

 Основываясь на полученной там информации, я смог придумать следующий 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 (). Он вернет массив с строковой версией и длинной версией кванта. Оттуда должно быть достаточно просто нормализовать значения или просто использовать новый диапазон.



 [документаци](http://php.net/manual/en/imagick.levelimage.php): Первое значение - это входное значение черной точки (тени), середина - это гамма (которая, как я предполагаю, совпадает со средней точкой Photoshop), а последнее - входное значение белой точки (выделение).

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