首页 > 解决方案 > 直方图平均值在循环中不改变

问题描述

我编写了一个脚本来将我的顶层设置为差异混合模式与其他 3 个图层进行比较。底层是顶层的精确副本。我查看文档直方图,检查平均值是否 < 1(稍后我将考虑一点差异,因此为 1),将图层调色板中的图层涂成红色并关闭图层...。重复. 我遇到的问题是每次迭代的平均值保持不变。我已将文件写入 csv,因此我可以调试问题,但我无法弄清楚为什么会发生这种情况。

#target photoshop

//  call the source document
var srcDoc = app.activeDocument;
var check = srcDoc.artLayers.getByName("check");
var layers = srcDoc.layers;
var docHisto = srcDoc.histogram;
//var Name = app.activeDocument.name.replace(/\.[^\.]+$/,'');
//var Ext = decodeURI(app.activeDocument.name).replace(/^.*\./,'');
//var Path=app.activeDocument.path;

startRulerUnits = app.preferences.rulerUnits;
startTypeUnits = app.preferences.typeUnits;

var original_units = app.preferences.rulerUnits;

//app.preferences.rulerUnits = Units.PERCENT;


//width and height of image
var imageWidth = srcDoc.width.as('px');
var imageWidth = srcDoc.width.value;
var imageHeight = srcDoc.height.as('px');
var imageHeight = srcDoc.height.value;

var numPixels = imageWidth*imageHeight;

var layNum = srcDoc.artLayers.length;



srcDoc.activeLayer = check;
check.blendMode = BlendMode.DIFFERENCE;

for (var i = 1; i < layNum; ++i) {
    var meanval = EvalHisto(docHisto, i) ;
   alert(meanval)


    if (meanval < 1){
        alert("same");
        srcDoc.activeLayer = layers[i];
        layercolor("red");
       }


    layers[i].visible = false;

}


 function layercolor(colour) {
         switch (colour.toLocaleLowerCase()){  
        case 'red': colour = 'Rd  '; break;  
        case 'orange' : colour = 'Orng'; break;  
        case 'yellow' : colour = 'Ylw '; break;  
        case 'yellow' : colour = 'Ylw '; break;  
        case 'green' : colour = 'Grn '; break;  
        case 'blue' : colour = 'Bl  '; break;  
        case 'violet' : colour = 'Vlt '; break;  
        case 'gray' : colour = 'Gry '; break;  
        case 'none' : colour = 'None'; break;  
        default : colour = 'None'; break;  
        } 

    var desc = new ActionDescriptor();  
        var ref = new ActionReference();  
        ref.putEnumerated( charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );  
    desc.putReference( charIDToTypeID('null'), ref );  
        var desc2 = new ActionDescriptor();  
        desc2.putEnumerated( charIDToTypeID('Clr '), charIDToTypeID('Clr '), charIDToTypeID(colour) );  
    desc.putObject( charIDToTypeID('T   '), charIDToTypeID('Lyr '), desc2 );  
    executeAction( charIDToTypeID('setd'), desc, DialogModes.NO ); 
 }; 



function EvalHisto(histogram, i) {

        var mean = 0;
        var total = 0;

        var luminosity = srcDoc.histogram;
        var red = srcDoc.channels["Red"].histogram;
        var green = srcDoc.channels["Green"].histogram;
        var blue = srcDoc.channels["Blue"].histogram;

        var datFile = new File("~/Desktop/Histogram" + i + ".csv");

        datFile.open("e");
        datFile.writeln("Level,Luminosity,Red,Green,Blue, Mean\r");

     for (var n = 0; n < histogram.length; n++) {
        total = total + histogram[n];   //calculate total histogram value over the 255 color space
        }

    for (var m = 0; m < histogram.length; m++){
        mean = mean + (m*histogram[m]/total);       //calculate running mean of intensity
        datFile.writeln(m + "," + luminosity[m] + "," + red[m] + "," + green[m] + "," + blue[m] + "," + mean + "\r");
        }

    datFile.close();
    return mean;
};

图层

标签: javascripthistogramphotoshopphotoshop-script

解决方案


I found the mistake, I needed to move

var docHisto = srcDoc.histogram;

into my layer loop, otherwise I would only ever be finding the histogram resulting from the first layer and second layer blend.


推荐阅读