Photoshop: цикл до тех пор, пока не будет достигнуто желаемое значение

Я запускаю приведенный ниже скрипт, чтобы проверить яркость пикселя на основе выбранного Color Sampler. А затем автоматически регулируйте экспозицию, пока яркость нужного пикселя не достигнет 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, любого из Красных/Зеленых или Синих каналов - он останавливается.

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

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

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


person Ryul    schedule 11.03.2019    source источник


Ответы (2)


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

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();
    }
}

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

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

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

person Olufemi Adesina    schedule 11.03.2019
comment
Наконец-то появилась возможность протестировать! К сожалению, он тоже зацикливается на неопределенный срок :( - person Ryul; 14.03.2019

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

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

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

2)

Как только он достигает 235, любого из Красных/Зеленых или Синих каналов - он останавливается.

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

person Sergey Kritskiy    schedule 12.03.2019