Вопрос по – Уровни 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
Основываясь на полученной там информации, я смог придумать следующий 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 (). Он вернет массив с строковой версией и длинной версией кванта. Оттуда должно быть достаточно просто нормализовать значения или просто использовать новый диапазон.
документаци: Первое значение - это входное значение черной точки (тени), середина - это гамма (которая, как я предполагаю, совпадает со средней точкой Photoshop), а последнее - входное значение белой точки (выделение).
Выходные значения фиксируются на квантовых значениях типа изображения, указывать их не нужно.
$im->levelImage(0, 0.92, 65535);
или$im->levelImage(0, 0.92, 255);
должен быть в точности эквивалентен Photoshop. Если это не так, скажите, пожалуйста, как далеко.
Mark Ransom