содержание канала javascript в фотошопе

пытаюсь написать что-то, что извлекает маски из RGB-каналов.

Я получаю много файлов .exr с масками, выводимыми как чистые слои RGB и B.

я сделал это:

    var doc = app.activeDocument;
        function showMasks(docGroups) {    

            //step through the groups
        for (var i=0; i<docGroups.length; i++) {

             try{   
             //step through the layers in each group
            for(layerIndex=0; layerIndex < docGroups[i].artLayers.length; layerIndex++) {
var RGB = [doc.channels.getByName('Red'),doc.channels.getByName('Green'),doc.channels.getByName('Blue')];


                    for(var a in RGB)
                   {

                //create slection from  channel
                doc.selection.load(RGB[a], SelectionType.REPLACE);
                //add new layer
                doc.artLayers.add();
                // REVEAL ALL from selection
                var idMk = charIDToTypeID( "Mk  " );
                var desc62 = new ActionDescriptor();
                var idNw = charIDToTypeID( "Nw  " );
                var idChnl = charIDToTypeID( "Chnl" );
                desc62.putClass( idNw, idChnl );
                var idAt = charIDToTypeID( "At  " );
                var ref20 = new ActionReference();
                var idChnl = charIDToTypeID( "Chnl" );
                var idChnl = charIDToTypeID( "Chnl" );
                var idMsk = charIDToTypeID( "Msk " );
                ref20.putEnumerated( idChnl, idChnl, idMsk );
                desc62.putReference( idAt, ref20 );
                var idUsng = charIDToTypeID( "Usng" );
                var idUsrM = charIDToTypeID( "UsrM" );
                var idRvlS = charIDToTypeID( "RvlS" );
                desc62.putEnumerated( idUsng, idUsrM, idRvlS );
                executeAction( idMk, desc62, DialogModes.NO );


                    }

                 //hide layer, move on to the next
                 docGroups[i].artLayers[layerIndex].visible = false;  

                }

              }   
               catch(e){continue;} 

     }

      }

    showMasks(doc.layerSets);

который работает нормально, проходит через группы и слои и выводит новые слои с масками слоев на них соответственно. однако это работает только в том случае, если слой содержит R G и B, если это слой только с одним цветом, он останавливается. как заставить его продолжать работать, если слой не содержит все 3 цвета канала? или переписать делать по одному каналу за раз?

любые идеи высоко ценятся, спасибо / S


person SEJM    schedule 14.12.2016    source источник
comment
решил это сам:   -  person SEJM    schedule 15.12.2016


Ответы (1)


сам решил это, проверив, сделан ли выбор, т. Е. Если выбор не сделан, канал пуст -> двигаться дальше.

Я работаю ретушером, и в настоящее время я получаю много .exr:s с 3D-продуктами. VRay выводит materialID/objectID как RGB-проходы. это значительно ускоряет рабочий процесс.

используйте так: поместите все проходы RGB в группу, скройте все остальные слои. скрипт вызова.

var doc = app.activeDocument;
var a=0;

function hasSelection (doc) {
    var ret = false;
    var as = doc.activeHistoryState;
    doc.selection.deselect();
    if (as != doc.activeHistoryState) {
        ret = true;
        doc.activeHistoryState = as;
    }
    return ret;
}

    function showMasks(docGroups) {    

        //this steps through the groups
        for (var i=0; i<docGroups.length; i++) {

         try{  

            // this steps through the layers in each group
            for(layerIndex=0; layerIndex < docGroups[i].artLayers.length; layerIndex++) {

             //visible layers only    
            if(docGroups[i].artLayers[layerIndex].visible == true){

            //var layer=docGroups[i].artLayers[layerIndex];
           var RGB = [doc.channels.getByName('Red'),doc.channels.getByName('Green'),doc.channels.getByName('Blue')];

                for(a in RGB)
                {
                    //create slection from  channel
                    doc.selection.load(RGB[a], SelectionType.REPLACE);

                    if(hasSelection(activeDocument)){

                    doc.artLayers.add();
                    // REVEAL ALL from selection
                    var idMk = charIDToTypeID( "Mk  " );
                    var desc62 = new ActionDescriptor();
                    var idNw = charIDToTypeID( "Nw  " );
                    var idChnl = charIDToTypeID( "Chnl" );
                    desc62.putClass( idNw, idChnl );
                    var idAt = charIDToTypeID( "At  " );
                    var ref20 = new ActionReference();
                    var idChnl = charIDToTypeID( "Chnl" );
                    var idChnl = charIDToTypeID( "Chnl" );
                    var idMsk = charIDToTypeID( "Msk " );
                    ref20.putEnumerated( idChnl, idChnl, idMsk );
                    desc62.putReference( idAt, ref20 );
                    var idUsng = charIDToTypeID( "Usng" );
                    var idUsrM = charIDToTypeID( "UsrM" );
                    var idRvlS = charIDToTypeID( "RvlS" );
                    desc62.putEnumerated( idUsng, idUsrM, idRvlS );
                    executeAction( idMk, desc62, DialogModes.NO );

                    }
                    else{a++;}

                }
             //hide layer, move on to the next
            docGroups[i].artLayers[layerIndex].visible = false;
          }
      }

          }       
           catch(e){return;} 

    }
 }

showMasks(doc.layerSets);

ваше здоровье. /С

person SEJM    schedule 15.12.2016