我运行以下脚本来检查基于拾取的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;
}
就实际循环而言,像这样的东西可以工作但是有很多开销:
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中可以想到的唯一可以使用范围处理循环而不使用数组和其他形式的操作的操作。这将至少贯穿红色,蓝色和绿色的所有值。
如果这至少有帮助,请告诉我。
(BTW此解决方案仅针对循环)
1)在其他地方是否有更大的代码块使用averageLuminosity
作为数组或这条线是错误的?
//Get Luminosity
var averageLuminosity = [(Red + Green + Blue)/3 ];
在这里,您将创建一个具有一个值的数组,但稍后您将此数组与值进行比较。
2)
一旦达到235,任何红色/绿色或蓝色通道 - 它就会停止。
提供的代码不起作用,如果我将颜色设置为255,255,0
,averageLuminosity
等于170,Luma20();
开始执行。在你的代码中,没有只对一个颜色组件进行比较,所以我不确定这怎么可能..?