Photoshop脚本 - 更改特定的文本图层内容

时间:2018-05-28 22:47:16

标签: javascript scripting photoshop

我有一个photoshop脚本文件,用于打开模板psd文件:

var fileRef = new File("z:\psd.psd")
var docRef = app.open (fileRef)

一旦打开,我希望代码更改特定图层的文本,名为" LAYER1"到" TEST"。

我已经研究并进行了大量测试,但我遇到了未定义变量的问题和错误。

1 个答案:

答案 0 :(得分:1)

有必要遍历所有图层(包括图层组中的图层),以查找特定的命名文本图层(例如 LAYER1 < / em>)之前可以更改文本内容。为此,我建议在脚本中添加自定义函数。

以下代码示例将文本图层的文本内容更改为 LAYER1 Hello World

var fileRef = new File('z:\psd.psd');
var docRef = app.open(fileRef);

/**
  * Change text content of a specific named Text Layer to a new text string.
  *
  * @param {Object} doc - A reference to the document to change.
  * @param {String} layerName - The name of the Text Layer to change.
  * @param {String} newTextString - New text content for the Text Layer.
  */
function changeTextLayerContent(doc, layerName, newTextString) {
  for (var i = 0, max = doc.layers.length; i < max; i++) {
    var layerRef = doc.layers[i];
    if (layerRef.typename === "ArtLayer") {
      if (layerRef.name === layerName && layerRef.kind === LayerKind.TEXT) {
        layerRef.textItem.contents = newTextString;
      }
    } else {
      changeTextLayerContent(layerRef, layerName, newTextString);
    }
  }
}

changeTextLayerContent(docRef, 'LAYER1', 'Hello World');

解释

调用函数:

  1. 上面的最后一行代码为:

    changeTextLayerContent(docRef, 'LAYER1', 'Hello World');
    

    是调用changeTextLayerContent函数的地方。

    我们将三个参数传递给函数,如下所示:

    • docRef - 这是更改其图层的文档的对象引用。
    • 'LAYER1' - 更改其内容的文字图层的名称。
    • 'Hello World' - 这是要应用于文本图层的新文本字符串(即内容)(在本例中,是文本图层名为{ {1}})。
  2. 我们假设我们按如下方式调用该函数:

    LAYER1

    这会将名为changeTextLayerContent(docRef, 'MainTitle', 'The quick brown fox'); 文本图层的文本内容设置为快速棕色狐狸

    注意:如果您的文档/模板包含多个名为MainTitle文本图层,那么他们的内容都会更改为快速棕色狐狸

  3. MainTitle功能:

    1. 该功能首先使用for statement循环遍历每个顶级图层,它们列在Photoshop的图层调色板。

    2. 然后检查图层changeTextLayerContent是否为typename

      • 如果其ArtLayertypename,则随后检查图层ArtLayer等于您提供的 layerName 以及图层{{1} }等于name。如果这些条件检查都为真,那么它将通过以下行显示文本图层的新文本内容:

        kind
      • 或者,如果图层LayerKind.TEXT不是layerRef.textItem.contents = newTextString; ,那么它必须是typename(即图层组)。在这种情况下,函数通过读取行​​重新调用自身:

        ArtLayer

        但是,这次它将LayerSet作为第一个参数传递,这会导致函数循环遍历组/集中的所有图层并检查它们。