【问题标题】:Photoshop script to duplicate and rename layer用于复制和重命名图层的 Photoshop 脚本
【发布时间】:2018-03-09 07:26:24
【问题描述】:

当我开始在 Photoshop 上处理新图片时,我在创建一个可以自动执行所有不同任务的脚本时,遇到了以下问题。

我想在这些组中创建不同的组和不同的层。在此之前一切都很好:

#target photoshop

app.bringToFront();

var doc = app.activeDocument;

newCurve();

var clippingHelpLayerLight = doc.activeLayer;
clippingHelpLayerLight.blendMode = BlendMode.SCREEN;
clippingHelpLayerLight.name = "Clipping Help Layer - Light";
clippingHelpLayerLight.visible = false;
clippingHelpLayerLight.duplicate();

var clippingHelpLayerLighter = doc.activeLayer;
clippingHelpLayerLighter.name = "Clipping Help Layer - Lighter";
clippingHelpLayerLighter.visible = false;

function newCurve() {
    var c_ADJ_LAYER = charIDToTypeID("AdjL");
    var c_ADJUSTMENT = charIDToTypeID("Adjs");
    var c_CHANNEL = charIDToTypeID("Chnl");
    var c_COMPOSITE = charIDToTypeID("Cmps");
    var c_CURVE = charIDToTypeID("Crv ");
    var c_CURVE_A = charIDToTypeID("CrvA");
    var c_CURVES = charIDToTypeID("Crvs");
    var c_HORIZONTAL = charIDToTypeID("Hrzn");
    var c_MAKE = charIDToTypeID("Mk  ");
    var c_NULL = charIDToTypeID("null");
    var c_POINT = charIDToTypeID("Pnt ");
    var c_TYPE = charIDToTypeID("Type");
    var c_USING = charIDToTypeID("Usng");
    var c_VERTICAL = charIDToTypeID("Vrtc");

    var d_CURVES_LAYER = new ActionDescriptor();
    // Contains all the information necessary to perform the "MAKE" action
    var r_CLASS = new ActionReference();
    r_CLASS.putClass(c_ADJ_LAYER);
    d_CURVES_LAYER.putReference(c_NULL, r_CLASS);
    // Class of make action is of an ajdustment layer
    var d_TYPE_CURVES = new ActionDescriptor();
    // Contains all the information about all the curves
    var d_CHANNEL_CURVES = new ActionDescriptor();
    var l_CHANNEL_CURVES = new ActionList();
    // Contains a list of channel curves
    var d_CHANNEL_CURVE = new ActionDescriptor();
    // Information for 1 channel curve
    var r_CHANNEL = new ActionReference();
    r_CHANNEL.putEnumerated(c_CHANNEL, c_CHANNEL, c_COMPOSITE);
    // This curve is for the composite channel - VARIES
    d_CHANNEL_CURVE.putReference(c_CHANNEL, r_CHANNEL);
    // Contains the point list
    var l_POINTS = new ActionList();
    // List of points for this channel - LENGTH VARIES
    var d_POINT = new ActionDescriptor();
    // One point on the curve, has INPUT and OUTPUT value
    d_POINT.putDouble(c_HORIZONTAL, 0.000000);
    d_POINT.putDouble(c_VERTICAL, 0.000000);
    l_POINTS.putObject(c_POINT, d_POINT);
    //var d_POINT3 = new ActionDescriptor();
    d_POINT.putDouble(c_HORIZONTAL, 255.000000);
    d_POINT.putDouble(c_VERTICAL, 255.000000);
    l_POINTS.putObject(c_POINT, d_POINT);
    // Made the list of points
    d_CHANNEL_CURVE.putList(c_CURVE, l_POINTS);
    // Now have a list of points for a specific channel
    l_CHANNEL_CURVES.putObject(c_CURVE_A, d_CHANNEL_CURVE);
    // Add to the list of channel curves
    d_CHANNEL_CURVES.putList(c_ADJUSTMENT, l_CHANNEL_CURVES);
    // All the channel curves are inside here
    d_TYPE_CURVES.putObject(c_TYPE, c_CURVES, d_CHANNEL_CURVES);
    // .....
    d_CURVES_LAYER.putObject(c_USING, c_ADJ_LAYER, d_TYPE_CURVES);
    // package the curves and definition of the adjustment layer type
    executeAction(c_MAKE, d_CURVES_LAYER, DialogModes.NO);
}

我实际上想创建一个名为“Clipping Help Layer - Light”的第一层,混合模式:屏幕并将其关闭。然后复制它,将新图层的名称更改为“Clipping Help Layer - Lighter”并关闭它。

像这样:Screenshot of what I would like to do

它确实创建了 2 个图层,但第一个图层的名称末尾有“副本”并且它保持打开状态。

Screenshot of the actual result

为什么?

我不明白为什么它不能按预期工作并且无法修复它。

任何帮助将不胜感激!

【问题讨论】:

  • 我看不到你的源图像,所以这是在黑暗中的刺,你可能想使用 getLayerByname 使新的较浅层成为 activeLayer。
  • 非常感谢您的回答!这是我第一次寻求有关脚本的帮助,我试图通过仅复制对我的问题有用的部分来保持简单。我现在意识到我没有复制足够多的代码来理解......
  • 所以我尝试在第二次重命名之前添加这个: doc.activeLayer = doc.artLayers.getByName("Clipping Help Layer - Light copy"); var clippingHelpLayerLighter = doc.activeLayer; clippingHelpLayerLighter.name = "剪辑帮助层 - 打火机"; clippingHelpLayerLighter.visible = false;或者甚至可能像这样: var clippingHelpLayerLighter = doc.artLayers.getByName("Clipping Help Layer - Light copy");但是不知道为什么,getByName不起作用,说找不到像这样命名的层...

标签: scripting photoshop jsx photoshop-script


【解决方案1】:

我相信您遇到的问题与doc.activeLayer 有关。在您复制“剪辑帮助图层 - 灯光”后,该脚本似乎并没有改变 doc.activeLayer 所指向的内容,因此当您尝试将其分配给 clippingHelpLayerLighter 时,您将指向一个未定义的图层。虽然我不知道你这样做时幕后究竟发生了什么,但我相信这会解决你的问题:

#target photoshop

app.bringToFront();

var doc = app.documents.add( 4, 4 );

doc = app.activeDocument;

var clippingHelpLayerLight = doc.activeLayer;
clippingHelpLayerLight.blendMode = BlendMode.SCREEN;
clippingHelpLayerLight.name = "Clipping Help Layer - Light";
clippingHelpLayerLight.visible = false;
clippingHelpLayerLight.duplicate();

doc.activeLayer = doc.layers[ "Clipping Help Layer - Light copy" ];
doc.activeLayer.name = "Clipping Help Layer - Lighter";
doc.activeLayer.visible = false;

//I am not sure if you need this pointer to be called upon later in your 
//code. If you do not, just leave this line out.
var clippingHelpLayerLighter = doc.activeLayer;

希望这会有所帮助!如果您有任何问题,请告诉我,我绝不是专家,但我经常使用脚本。

【讨论】:

  • 非常感谢您的回答。这确实是 doc.activeLayer 没有指向正确的东西的问题。您的解决方案运行良好,谢谢!
  • 没问题!很高兴它有帮助。
猜你喜欢
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 2016-09-27
  • 2015-07-03
  • 2015-06-05
  • 2017-10-05
相关资源
最近更新 更多