首页 > 解决方案 > Photoshop 脚本 - 更改特定的文本图层内容

问题描述

我有一个打开模板 psd 文件的 Photoshop 脚本文件:

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

一旦打开,我想要将名为“LAYER1”的特定层的文本更改为“TEST”的代码。

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

标签: javascriptscriptingphotoshop

解决方案


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

以下代码示例将名为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'- 这是应用于文本层(在本例中,应用于名为的文本层LAYER1)的新文本字符串(即内容)。
  2. 假设我们要调用该函数,如下所示:

    changeTextLayerContent(docRef, 'MainTitle', 'The quick brown fox');
    

    这会将名为The quick brown fox的Text LayerMainTitle的文本内容设置为。

    注意:如果您的文档/模板包含多个命名的文本层MainTitle,那么它们的内容都会更改为The quick brown fox

changeTextLayerContent功能:

  1. 该函数首先利用for语句循环遍历 Photoshop图层面板中列出的每个顶级图层组。

  2. 然后检查图层是否typenameArtLayer.

    • 如果它typenameArtLayer它随后然后检查层是否name等于您提供的layerNamekind以及层是否等于LayerKind.TEXT。如果这些条件检查都为真,那么它才会通过以下行为文本层设置新的文本内容:

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

      changeTextLayerContent(layerRef, layerName, newTextString); 
      

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



推荐阅读