Skip to main content
Known Participant
November 7, 2023
Resuelto

Is there a way to delete the mask of selected layers at once?

  • November 7, 2023
  • 4 respuestas
  • 1217 visualizaciones
Can anyone help? 
Is there a way to delete the mask of selected layers at once? 
 

 

Este tema ha sido cerrado para respuestas.
Mejor respuesta de Stephen Marsh

@Thihasoe 

 

Script Features:

  • Single undo history step
  • Applies layer mask to layer data where applicable (i.e. raster layers)
  • Change applyLayerMask(true); to applyLayerMask(false); to remove the mask without applying it (line 61)
  • Layers and visibility remain selected after the script is run

 

/*
Delete Selected Layers Masks.jsx
v1.0, 8th November 2023, Stephen Marsh
https://community.adobe.com/t5/photoshop-ecosystem-discussions/is-there-a-way-to-delete-the-mask-of-selected-layers-at-once/td-p/14217756
*/

#target photoshop

function main() {

    // Capture the initial layer visibility and layer selection
    var currentLayersState = getLayersVisiblity();

    // Process selected layers
    var s2t = stringIDToTypeID;
    (r = new ActionReference()).putProperty(s2t('property'), p = s2t('targetLayersIDs'));
    r.putEnumerated(s2t('document'), s2t('ordinal'), s2t('targetEnum'));
    var lrs = executeActionGet(r).getList(p),
        sel = new ActionReference();

    // Loop over the selected layers
    for (var i = 0; i < lrs.count; i++) {
        sel.putIdentifier(s2t('layer'), p = lrs.getReference(i).getIdentifier(s2t('layerID')));
        (r = new ActionReference()).putIdentifier(s2t('layer'), p);
        (d = new ActionDescriptor()).putReference(s2t("target"), r);
        executeAction(s2t('select'), d, DialogModes.NO);

        // Select the raster mask channel
        selectLayerCompositeChannel("mask");

        // Conditional check for layer kind
        s2t = stringIDToTypeID;
        (r = new ActionReference()).putProperty(s2t('property'), p = s2t('layerKind'));
        r.putEnumerated(s2t('layer'), s2t('ordinal'), s2t('targetEnum'));
        var layerKind = executeActionGet(r).getInteger(p);
        /*
        https://community.adobe.com/t5/photoshop-ecosystem-discussions/how-to-check-layer-kind-using-javascript/m-p/13174707
        const kAnySheet             = 0 
        const kPixelSheet           = 1  
        const kAdjustmentSheet      = 2  
        const kTextSheet            = 3  
        const kVectorSheet          = 4  
        const kSmartObjectSheet     = 5  
        const kVideoSheet           = 6  
        const kLayerGroupSheet      = 7  
        const k3DSheet              = 8  
        const kGradientSheet        = 9  
        const kPatternSheet         = 10  
        const kSolidColorSheet      = 11  
        const kBackgroundSheet      = 12  
        const kHiddenSectionBounder = 13

        https://web.archive.org/web/20190812233828/http://creativetuts.com:80/photoshop-script-determine-layer-kind/
        DOM code doesn't have a generic adjustment layer kind, it is specific to each kind (LayerKind.CHANNELMIXER || LayerKind.COLORBALANCE etc).
        It is obviously more concise to use AM code for a generic adjustment layer check, rather than chaining together all possible adjustment layer kinds.
        */
        
        if (layerKind === 2 || 4) {
            removeLayerMask();
        } else {
            applyLayerMask(true);
        }
    }
    
    // Restore the initial layer visibility and selection
    setLayersVisiblity(currentLayersState);
}

app.activeDocument.suspendHistory("Delete Selected Layers Masks...", "main()");


//// Functions ////

function selectLayerCompositeChannel(chanPara) {
    // "RGB" | "mask"
    var s2t = function (s) {
        return app.stringIDToTypeID(s);
    };
    var descriptor = new ActionDescriptor();
    var reference = new ActionReference();
    reference.putEnumerated(s2t("channel"), s2t("channel"), s2t(chanPara));
    descriptor.putReference(s2t("null"), reference);
    descriptor.putBoolean(s2t("makeVisible"), false);
    executeAction(s2t("select"), descriptor, DialogModes.NO);
}

function applyLayerMask(applyORdelete) {
    // Suitable for most layer kinds
    function s2t(s) {
        return app.stringIDToTypeID(s);
    }
    var descriptor = new ActionDescriptor();
    var reference = new ActionReference();
    reference.putEnumerated(s2t("channel"), s2t("ordinal"), s2t("targetEnum"));
    descriptor.putReference(s2t("null"), reference);
    descriptor.putBoolean(s2t("apply"), applyORdelete); // boolean
    executeAction(s2t("delete"), descriptor, DialogModes.NO);
}

function removeLayerMask() {
    // Suitable for layer kinds such as Adjustment or Vector
    var iddelete = stringIDToTypeID("delete");
    var desc520 = new ActionDescriptor();
    var idnull = stringIDToTypeID("null");
    var ref130 = new ActionReference();
    var idchannel = stringIDToTypeID("channel");
    var idordinal = stringIDToTypeID("ordinal");
    var idtargetEnum = stringIDToTypeID("targetEnum");
    ref130.putEnumerated(idchannel, idordinal, idtargetEnum);
    desc520.putReference(idnull, ref130);
    executeAction(iddelete, desc520, DialogModes.NO);
}

//// Functions - from jazz-y ////

function getLayersVisiblity() {
    var s2t = stringIDToTypeID,
        t2s = typeIDToStringID;
    (r = new ActionReference()).putProperty(s2t('property'), p = s2t('targetLayersIDs'));
    r.putEnumerated(s2t('document'), s2t('ordinal'), s2t('targetEnum'));
    var targetLayers = executeActionGet(r).getList(p),
        seletion = [],
        visiblity = {};
    for (var i = 0; i < targetLayers.count; i++) seletion.push(targetLayers.getReference(i).getIdentifier());
    (r = new ActionReference()).putProperty(s2t('property'), p = s2t('numberOfLayers'));
    r.putEnumerated(s2t('document'), s2t('ordinal'), s2t('targetEnum'));
    var len = executeActionGet(r).getInteger(p);
    for (var i = 1; i <= len; i++) {
        (r = new ActionReference()).putProperty(s2t('property'), p = s2t('layerSection'));
        r.putIndex(s2t('layer'), i);
        if (t2s(executeActionGet(r).getEnumerationValue(p)) == 'layerSectionEnd') continue;
        (r = new ActionReference()).putProperty(s2t('property'), p = s2t('layerID'));
        r.putIndex(s2t('layer'), i);
        var id = executeActionGet(r).getInteger(p);
        (r = new ActionReference()).putProperty(s2t('property'), p = s2t('visible'));
        r.putIndex(s2t('layer'), i);
        var visible = executeActionGet(r).getBoolean(p);
        visiblity[id] = visible;
    }
    return {
        selection: seletion,
        visiblity: visiblity
    };
}

function setLayersVisiblity(layersStateObject) {
    var s2t = stringIDToTypeID;
    for (var a in layersStateObject.visiblity) {
        makeVisible = layersStateObject.visiblity[a] ? "show" : "hide";
        (r = new ActionReference()).putIdentifier(s2t('layer'), a);
        (d = new ActionDescriptor()).putReference(s2t('target'), r);
        executeAction(s2t(makeVisible), d, DialogModes.NO);
    }
    if (layersStateObject.selection.length) {
        var r = new ActionReference();
        for (var i = 0; i < layersStateObject.selection.length; i++)
            r.putIdentifier(s2t("layer"), layersStateObject.selection[i]);
        (d = new ActionDescriptor()).putReference(s2t("target"), r);
        d.putBoolean(s2t("makeVisible"), false);
        executeAction(s2t("select"), d, DialogModes.NO);
    } else {
        (r = new ActionReference()).putEnumerated(s2t("layer"), s2t('ordinal'), s2t('targetEnum'));
        (d = new ActionDescriptor()).putReference(s2t('target'), r);
        executeAction(s2t('selectNoLayers'), d, DialogModes.NO);
    }
}

 

https://prepression.blogspot.com/2017/11/downloading-and-installing-adobe-scripts.html

 

4 respuestas

Stephen Marsh
Community Expert
Stephen MarshCommunity ExpertRespuesta
Community Expert
November 7, 2023

@Thihasoe 

 

Script Features:

  • Single undo history step
  • Applies layer mask to layer data where applicable (i.e. raster layers)
  • Change applyLayerMask(true); to applyLayerMask(false); to remove the mask without applying it (line 61)
  • Layers and visibility remain selected after the script is run

 

/*
Delete Selected Layers Masks.jsx
v1.0, 8th November 2023, Stephen Marsh
https://community.adobe.com/t5/photoshop-ecosystem-discussions/is-there-a-way-to-delete-the-mask-of-selected-layers-at-once/td-p/14217756
*/

#target photoshop

function main() {

    // Capture the initial layer visibility and layer selection
    var currentLayersState = getLayersVisiblity();

    // Process selected layers
    var s2t = stringIDToTypeID;
    (r = new ActionReference()).putProperty(s2t('property'), p = s2t('targetLayersIDs'));
    r.putEnumerated(s2t('document'), s2t('ordinal'), s2t('targetEnum'));
    var lrs = executeActionGet(r).getList(p),
        sel = new ActionReference();

    // Loop over the selected layers
    for (var i = 0; i < lrs.count; i++) {
        sel.putIdentifier(s2t('layer'), p = lrs.getReference(i).getIdentifier(s2t('layerID')));
        (r = new ActionReference()).putIdentifier(s2t('layer'), p);
        (d = new ActionDescriptor()).putReference(s2t("target"), r);
        executeAction(s2t('select'), d, DialogModes.NO);

        // Select the raster mask channel
        selectLayerCompositeChannel("mask");

        // Conditional check for layer kind
        s2t = stringIDToTypeID;
        (r = new ActionReference()).putProperty(s2t('property'), p = s2t('layerKind'));
        r.putEnumerated(s2t('layer'), s2t('ordinal'), s2t('targetEnum'));
        var layerKind = executeActionGet(r).getInteger(p);
        /*
        https://community.adobe.com/t5/photoshop-ecosystem-discussions/how-to-check-layer-kind-using-javascript/m-p/13174707
        const kAnySheet             = 0 
        const kPixelSheet           = 1  
        const kAdjustmentSheet      = 2  
        const kTextSheet            = 3  
        const kVectorSheet          = 4  
        const kSmartObjectSheet     = 5  
        const kVideoSheet           = 6  
        const kLayerGroupSheet      = 7  
        const k3DSheet              = 8  
        const kGradientSheet        = 9  
        const kPatternSheet         = 10  
        const kSolidColorSheet      = 11  
        const kBackgroundSheet      = 12  
        const kHiddenSectionBounder = 13

        https://web.archive.org/web/20190812233828/http://creativetuts.com:80/photoshop-script-determine-layer-kind/
        DOM code doesn't have a generic adjustment layer kind, it is specific to each kind (LayerKind.CHANNELMIXER || LayerKind.COLORBALANCE etc).
        It is obviously more concise to use AM code for a generic adjustment layer check, rather than chaining together all possible adjustment layer kinds.
        */
        
        if (layerKind === 2 || 4) {
            removeLayerMask();
        } else {
            applyLayerMask(true);
        }
    }
    
    // Restore the initial layer visibility and selection
    setLayersVisiblity(currentLayersState);
}

app.activeDocument.suspendHistory("Delete Selected Layers Masks...", "main()");


//// Functions ////

function selectLayerCompositeChannel(chanPara) {
    // "RGB" | "mask"
    var s2t = function (s) {
        return app.stringIDToTypeID(s);
    };
    var descriptor = new ActionDescriptor();
    var reference = new ActionReference();
    reference.putEnumerated(s2t("channel"), s2t("channel"), s2t(chanPara));
    descriptor.putReference(s2t("null"), reference);
    descriptor.putBoolean(s2t("makeVisible"), false);
    executeAction(s2t("select"), descriptor, DialogModes.NO);
}

function applyLayerMask(applyORdelete) {
    // Suitable for most layer kinds
    function s2t(s) {
        return app.stringIDToTypeID(s);
    }
    var descriptor = new ActionDescriptor();
    var reference = new ActionReference();
    reference.putEnumerated(s2t("channel"), s2t("ordinal"), s2t("targetEnum"));
    descriptor.putReference(s2t("null"), reference);
    descriptor.putBoolean(s2t("apply"), applyORdelete); // boolean
    executeAction(s2t("delete"), descriptor, DialogModes.NO);
}

function removeLayerMask() {
    // Suitable for layer kinds such as Adjustment or Vector
    var iddelete = stringIDToTypeID("delete");
    var desc520 = new ActionDescriptor();
    var idnull = stringIDToTypeID("null");
    var ref130 = new ActionReference();
    var idchannel = stringIDToTypeID("channel");
    var idordinal = stringIDToTypeID("ordinal");
    var idtargetEnum = stringIDToTypeID("targetEnum");
    ref130.putEnumerated(idchannel, idordinal, idtargetEnum);
    desc520.putReference(idnull, ref130);
    executeAction(iddelete, desc520, DialogModes.NO);
}

//// Functions - from jazz-y ////

function getLayersVisiblity() {
    var s2t = stringIDToTypeID,
        t2s = typeIDToStringID;
    (r = new ActionReference()).putProperty(s2t('property'), p = s2t('targetLayersIDs'));
    r.putEnumerated(s2t('document'), s2t('ordinal'), s2t('targetEnum'));
    var targetLayers = executeActionGet(r).getList(p),
        seletion = [],
        visiblity = {};
    for (var i = 0; i < targetLayers.count; i++) seletion.push(targetLayers.getReference(i).getIdentifier());
    (r = new ActionReference()).putProperty(s2t('property'), p = s2t('numberOfLayers'));
    r.putEnumerated(s2t('document'), s2t('ordinal'), s2t('targetEnum'));
    var len = executeActionGet(r).getInteger(p);
    for (var i = 1; i <= len; i++) {
        (r = new ActionReference()).putProperty(s2t('property'), p = s2t('layerSection'));
        r.putIndex(s2t('layer'), i);
        if (t2s(executeActionGet(r).getEnumerationValue(p)) == 'layerSectionEnd') continue;
        (r = new ActionReference()).putProperty(s2t('property'), p = s2t('layerID'));
        r.putIndex(s2t('layer'), i);
        var id = executeActionGet(r).getInteger(p);
        (r = new ActionReference()).putProperty(s2t('property'), p = s2t('visible'));
        r.putIndex(s2t('layer'), i);
        var visible = executeActionGet(r).getBoolean(p);
        visiblity[id] = visible;
    }
    return {
        selection: seletion,
        visiblity: visiblity
    };
}

function setLayersVisiblity(layersStateObject) {
    var s2t = stringIDToTypeID;
    for (var a in layersStateObject.visiblity) {
        makeVisible = layersStateObject.visiblity[a] ? "show" : "hide";
        (r = new ActionReference()).putIdentifier(s2t('layer'), a);
        (d = new ActionDescriptor()).putReference(s2t('target'), r);
        executeAction(s2t(makeVisible), d, DialogModes.NO);
    }
    if (layersStateObject.selection.length) {
        var r = new ActionReference();
        for (var i = 0; i < layersStateObject.selection.length; i++)
            r.putIdentifier(s2t("layer"), layersStateObject.selection[i]);
        (d = new ActionDescriptor()).putReference(s2t("target"), r);
        d.putBoolean(s2t("makeVisible"), false);
        executeAction(s2t("select"), d, DialogModes.NO);
    } else {
        (r = new ActionReference()).putEnumerated(s2t("layer"), s2t('ordinal'), s2t('targetEnum'));
        (d = new ActionDescriptor()).putReference(s2t('target'), r);
        executeAction(s2t('selectNoLayers'), d, DialogModes.NO);
    }
}

 

https://prepression.blogspot.com/2017/11/downloading-and-installing-adobe-scripts.html

 

Known Participant
November 8, 2023

Thank you so much Sir @Stephen Marsh  

This is very cool

Stephen Marsh
Community Expert
Community Expert
November 8, 2023

You're welcome, enjoy!

Stephen Marsh
Community Expert
Community Expert
November 7, 2023

@Thihasoe 

 

As @Kevin Stohlmeyer wrote, scripting is the solution that comes to mind.

 

I don't recall of an existing script explicitly for this task, but one can be created. What do you want to happen when the masks are removed?

 

  • Apply the mask (not applicable for adjustment layers, but is applicable for pixels layers)?
  • Delete the mask without applying it (suitable for adjustment layers and vector layers)?
  • Something else?

 

josantgomez
Legend
November 7, 2023
Kevin Stohlmeyer
Community Expert
Community Expert
November 7, 2023

@josantgomez how does that help?

josantgomez
Legend
November 7, 2023

Como seguro que sabes el enlace nos lleva a una nota que explica las capas y lo que puede hacerse. También como eliminarlas.

Como dices, es posible que esta operación necesite de un script. Pero , al menos, podrá conocer todo lo que Photoshop tiene previsto para ello, como agrupar capas por ejemplo. ¿He molestado? Si es así, lo lamento mucho. Lo que yo no sé siempre podrá ampliarlo un experto. 

Kevin Stohlmeyer
Community Expert
Community Expert
November 7, 2023

@Thihasoe I'm sure someone has devised a script that can do this, but out of the box Photoshop cannot.