Photoshop: цикл до достижения желаемого значения - PullRequest
0 голосов
/ 12 марта 2019

Я запускаю приведенный ниже скрипт, чтобы проверить яркость пикселя на основе выбранного цветового сэмплера. Затем автоматически настраивайте экспозицию до тех пор, пока яркость нужного пикселя не достигнет 235 ~.

//Get color sampler values
var colorSampler = app.activeDocument.colorSamplers[0];

//RGB values
var Red = colorSampler.color.rgb.red
var Green = colorSampler.color.rgb.green
var Blue = colorSampler.color.rgb.blue
var RGB = [ Red, Green, Blue ];

//Get Luminosity
var averageLuminosity = [(Red + Green + Blue)/3 ];
    

LumaCheck();

function LumaCheck () {
    if (averageLuminosity < 215) {
        Luma20();
    } else if (averageLuminosity < 225) {
        Luma10();
    } else if (averageLuminosity < 230) {
        Luma5();
    } else if (averageLuminosity < 233) {
        Luma1();
    } else if (averageLuminosity < 235) {
        Luma1();
        Luma1();
    } else (averageLuminosity >= 235) {
    //do nothing    
    }
}

Отлично работает на белых, хотя борется на цветных пикселях: где значения RGB пикселя сильно отличаются. Как только он достигает 235, любого из каналов Red / Green или Blue - он останавливается.

Как бы вы продолжали создавать цикл, пока все значения RGB не достигнут значения "больше или равно значению 235"?

Я попытался сделать простой цикл, но он не остановится совсем. Если бы кто-нибудь мог указать мне правильное направление, это было бы очень ценно!

while (averageLuminosity < 235) {
    Luma1();
    if (averageLuminosity >= 235)
        break;
}

Ответы [ 2 ]

1 голос
/ 12 марта 2019

1) Есть ли где-нибудь еще кусок кода, который использует averageLuminosity в качестве массива или эта строка является ошибкой?

//Get Luminosity
var averageLuminosity = [(Red + Green + Blue)/3 ];

Здесь вы создаете массив с одним значением, но позжеВы сравниваете этот массив со значением.

2)

Как только он достигает 235, любой из каналов Red / Green или Blue - он останавливается.

Предоставленный код не работает так, если я установил цвет на 255,255,0, averageLuminosity равен 170, Luma20(); начнет выполняться.Также в вашем коде нет сравнения только с одним компонентом цвета, поэтому я не уверен, как это возможно ..?

1 голос
/ 12 марта 2019

С точки зрения фактического цикла, что-то вроде этого может работать, но имеет много накладных расходов:

var avrLum = 0

for(var i = 0; i <= 235; i++) {
  for(var j = 0; j <= 235; j++) {
    for(var k = 0; k <= 235; k++) {
      avrLum = (i+j+k)/3
      LumaCheck(avrLum);
    } 
  }
}

function LumaCheck (averageLuminosity) {
    if (averageLuminosity < 215) {
        Luma20();
    } else if (averageLuminosity < 225) {
        Luma10();
    } else if (averageLuminosity < 230) {
        Luma5();
    } else if (averageLuminosity < 235) {
        Luma1();
    }
}

Для циклов обычно избегают из-за медлительности, но на самом деле это единственные операции, которые я могу придумать в JS, которые могут обрабатывать циклы с использованием диапазонов без использования массивов и других форм манипуляций. Это, по крайней мере, пройдет через все значения Red, Blue и Green.

Дайте мне знать, если это поможет.

(Кстати, это решение касается только цикла)

...