Photoshop:循环直到达到所需值
Photoshop: Loop until desired value is reached
我 运行 下面的脚本根据拾取的颜色采样器检查像素的亮度。然后自动调整曝光,直到所需像素的亮度达到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 或蓝色通道中的任何一个 - 它就会停止。
您将如何继续创建循环,直到 所有 RGB 值达到 "greater or equal to 235 value"?
我试过做一个简单的循环,但它根本不会停止。如果有人能指出我正确的方向,将不胜感激!
while (averageLuminosity < 235) {
Luma1();
if (averageLuminosity >= 235)
break;
}
就实际循环而言,类似这样的方法可以工作但开销很大:
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 中能想到的唯一可以使用范围处理循环而不使用数组和其他形式的操作的操作。这至少会遍历红色、蓝色和绿色的所有值。
如果这至少有帮助,请告诉我。
(顺便说一句,此解决方案仅针对循环)
1) 其他地方是否有更大的代码块使用 averageLuminosity
作为数组或者这一行是错误的?
//Get Luminosity
var averageLuminosity = [(Red + Green + Blue)/3 ];
此处您创建了一个具有一个值的数组,但稍后您将该数组与一个值进行比较。
2)
As soon as it reaches 235, of any of the Red/Green or Blue channels - it stops.
提供的代码不是那样工作的,如果我将颜色设置为255,255,0
,averageLuminosity
等于170,Luma20();
开始执行。同样在您的代码中,没有仅与一种颜色分量进行比较,所以我不确定这怎么可能..?
我 运行 下面的脚本根据拾取的颜色采样器检查像素的亮度。然后自动调整曝光,直到所需像素的亮度达到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 或蓝色通道中的任何一个 - 它就会停止。
您将如何继续创建循环,直到 所有 RGB 值达到 "greater or equal to 235 value"?
我试过做一个简单的循环,但它根本不会停止。如果有人能指出我正确的方向,将不胜感激!
while (averageLuminosity < 235) {
Luma1();
if (averageLuminosity >= 235)
break;
}
就实际循环而言,类似这样的方法可以工作但开销很大:
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 中能想到的唯一可以使用范围处理循环而不使用数组和其他形式的操作的操作。这至少会遍历红色、蓝色和绿色的所有值。
如果这至少有帮助,请告诉我。
(顺便说一句,此解决方案仅针对循环)
1) 其他地方是否有更大的代码块使用 averageLuminosity
作为数组或者这一行是错误的?
//Get Luminosity
var averageLuminosity = [(Red + Green + Blue)/3 ];
此处您创建了一个具有一个值的数组,但稍后您将该数组与一个值进行比较。
2)
As soon as it reaches 235, of any of the Red/Green or Blue channels - it stops.
提供的代码不是那样工作的,如果我将颜色设置为255,255,0
,averageLuminosity
等于170,Luma20();
开始执行。同样在您的代码中,没有仅与一种颜色分量进行比较,所以我不确定这怎么可能..?