Photoshop 脚本 - 如何在图层面板中保持相同的图层位置

Photoshop Script - How To Maintain The Same Layer Position In Layers Panel

下面的函数获取第 X 层并复制第 X 层。

它采用图层 X 复制,同时保持比例将高度调整为 600px。 var newdLayer

它采用 X 层并在保持比例的同时将宽度调整为 900px 并应用高斯模糊。变模糊。

然后合并图层 X 和图层 X 副本。

我遇到的问题是,例如,如果我在 图层面板 中的第 4 层执行脚本,则在执行脚本后,图层变为第 1 层图层面板

因此,它把图层打乱了顺序。

如何确保图层在图层面板中的图层顺序中保持其位置?

    (function()
    {

        var startRulerUnits = app.preferences.rulerUnits;
        app.preferences.rulerUnits = Units.PIXELS;

        var docRef = activeDocument;
        var blur = docRef.activeLayer;

        // since we resize based on the initial size of the source layer, 
        // we don't need to get the bounds twice
        var bounds = blur.bounds;
        var height = bounds[3].value - bounds[1].value;
        var width = bounds[2].value - bounds[0].value;

        /////////////////////////////////////////////////////////////////////////////////////
        // Centering the layer

        // Getting center coordinates of the document
        var docCenterW = docRef.width.as("px") / 2;
        var docCenterH = docRef.height.as("px") / 2;

        // getting values to translate the layer. 
        var deltaX = Math.round(docCenterW - (bounds[0].value + width / 2));
        var deltaY = Math.round(docCenterH - (bounds[1].value + height / 2));

        blur.translate(deltaX, deltaY);
        /////////////////////////////////////////////////////////////////////////////////////

        var newdLayer = blur.duplicate();

        // declare 2 different vars for your sizes (there are better ways to do this, but
        // since you say you aren't a JavaScript pro, I figured I'd keep it simple)
        var newSize600 = (100 / height) * 600;
        var newSize900 = (100 / width) * 900;
        // resize your layers
        newdLayer.resize(newSize600, newSize600, AnchorPosition.MIDDLECENTER);
        blur.resize(newSize900, newSize900, AnchorPosition.MIDDLECENTER);
        // apply blur
        blur.applyGaussianBlur(5);

        // below creates the group, moves the layers to it and merges them. Feel free to just include this part
        // at the end of your function if you don't want to use the modified code above. 

        // create a new layer set
        var groupOne = docRef.layerSets.add();

        // move the blur layer inside the layer set and name the layer for posterity
        blur.move(groupOne, ElementPlacement.INSIDE);
        blur.name = "blur";

        // move the newdLayer inside and rename
        newdLayer.move(groupOne, ElementPlacement.INSIDE);
        newdLayer.name = "newdLayer";

        // merge the layer set and name the new layer
        var mergedGroup = groupOne.merge();
        mergedGroup.name = "newdLayer + blur";

        app.preferences.rulerUnits = startRulerUnits;

    })();

是的,当使用 DOM 创建时,一个新组会到达堆栈的顶部。使用AM代码创建群组没有这个特殊性,所以你可以使用它来代替。

(function()
{

    var startRulerUnits = app.preferences.rulerUnits;
    app.preferences.rulerUnits = Units.PIXELS;

    var docRef = activeDocument;
    var blur = docRef.activeLayer;

    // since we resize based on the initial size of the source layer, 
    // we don't need to get the bounds twice
    var bounds = blur.bounds;
    var height = bounds[3].value - bounds[1].value;
    var width = bounds[2].value - bounds[0].value;

    /////////////////////////////////////////////////////////////////////////////////////
    // Centering the layer

    // Getting center coordinates of the document
    var docCenterW = docRef.width.as("px") / 2;
    var docCenterH = docRef.height.as("px") / 2;

    // getting values to translate the layer. 
    var deltaX = Math.round(docCenterW - (bounds[0].value + width / 2));
    var deltaY = Math.round(docCenterH - (bounds[1].value + height / 2));

    blur.translate(deltaX, deltaY);
    /////////////////////////////////////////////////////////////////////////////////////

    var newdLayer = blur.duplicate();

    // declare 2 different vars for your sizes (there are better ways to do this, but
    // since you say you aren't a JavaScript pro, I figured I'd keep it simple)
    var newSize600 = (100 / height) * 600;
    var newSize900 = (100 / width) * 900;
    // resize your layers
    newdLayer.resize(newSize600, newSize600, AnchorPosition.MIDDLECENTER);
    blur.resize(newSize900, newSize900, AnchorPosition.MIDDLECENTER);
    // apply blur
    blur.applyGaussianBlur(5);

    // below creates the group, moves the layers to it and merges them. Feel free to just include this part
    // at the end of your function if you don't want to use the modified code above. 

    // create a new layer set
    createGroup();
    var groupOne = docRef.activeLayer;

    // move the blur layer inside the layer set and name the layer for posterity
    blur.move(groupOne, ElementPlacement.INSIDE);
    blur.name = "blur";

    // move the newdLayer inside and rename
    newdLayer.move(groupOne, ElementPlacement.INSIDE);
    newdLayer.name = "newdLayer";

    // merge the layer set and name the new layer
    var mergedGroup = groupOne.merge();
    mergedGroup.name = "newdLayer + blur";

    app.preferences.rulerUnits = startRulerUnits;

    function createGroup()
    {
        var desc22 = new ActionDescriptor();
        var ref2 = new ActionReference();
        ref2.putClass(stringIDToTypeID('layerSection'));
        desc22.putReference(charIDToTypeID('null'), ref2);
        desc22.putString(charIDToTypeID('Nm  '), "Group 1");
        executeAction(charIDToTypeID('Mk  '), desc22, DialogModes.NO);
    } // end of createGroup()

})();