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

Javascript Photoshop脚本-如何在“图层”面板中保持相同的图层位置,javascript,position,photoshop,layer,Javascript,Position,Photoshop,Layer,下面的函数获取X层并复制X层 它采用X层复制,并在保持比例的同时将高度调整为600px。var newdLayer 它采用X层,在保持比例的同时将宽度调整为900px,并应用高斯模糊。变量模糊 然后合并X层和X层副本 我遇到的问题是,例如,如果在执行脚本后在“层”面板中的第4层上执行脚本,则该层将成为“层”面板中的第1层 因此,它会使层失去顺序 如何确保层在“层”面板中的层序列中保持其位置 是的,当使用DOM创建时,一个新组将进入堆栈的顶部。使用AM代码创建组没有这种特殊性,所以您可以使用它 (

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

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

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

然后合并X层和X层副本

我遇到的问题是,例如,如果在执行脚本后在“层”面板中的第4层上执行脚本,则该层将成为“层”面板中的第1层

因此,它会使层失去顺序

如何确保层在“层”面板中的层序列中保持其位置


是的,当使用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()

})();

令人惊叹的工作得很漂亮!
(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()

})();