【问题标题】:Photoshop Script - How To Maintain The Same Layer Position In Layers PanelPhotoshop 脚本 - 如何在图层面板中保持相同的图层位置
【发布时间】:2019-08-22 19:47:07
【问题描述】:

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

它需要 X 层副本,并在保持比例的同时将高度调整为 600 像素。 var newdLayer

它需要 X 层,并在保持比率的同时将宽度调整为 900 像素并应用高斯模糊。变模糊。

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

我遇到的问题是,例如,如果我在执行脚本后在 Layers Panel 中的第 4 层执行脚本,则 Layer 将成为 Layers 中的第 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;

    })();

【问题讨论】:

    标签: javascript position photoshop layer


    【解决方案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()
    
    })();
    

    【讨论】:

    • 太棒了!效果很好!
    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 2017-10-05
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2013-11-26
    相关资源
    最近更新 更多