在Photoshop中使用Java脚本修改文本项的内容

2022-09-04 00:00:00 javascript photoshop

我知道如何使用下面这样的代码在Photoshop中设置文本项的内容

var al = doc.activeLayer;
if(al.kind == LayerKind.TEXT) {
    //get the textItem
    var ti = al.textItem;
    //change contents
   ti.contents = "stackoverflow";
}
但是,是否可以仅修改其部分内容并应用格式设置。例如,在作品"StackOverflow"中,我只想选择第一个字母,并将字体设置为30px,其余的保持不变?


解决方案

据我所知,没有简单的方法可以做到这一点。首先,这在DOM中是不可能的,所以忘记使用textItem.contents。对于AM,棘手的部分是用于文本层的AM代码非常精确。每次更改某些内容时,它都会为所有"块"文本定义所有可能的参数,例如,在本例中,我用Gudea字体编写了一个35px高的文本层,并将一个字母更改为70px:https://pastebin.com/XLP64azz 您可能会看到其中有很多垃圾,文本层现在被视为3个独立的块:字母从0到5(第64-65行:stack),从5到6(第217-218行:O)和从6到14(第281-282行:verflow)。在每个块的稍低处有设置大小的行,例如

desc62.putUnitDouble( cTID('Sz  '), cTID('#Pxl'), 35.000000 );
desc62.putUnitDouble( sTID('impliedFontSize'), cTID('#Pxl'), 35.000000 );

我知道可以删除大多数多余的描述符(例如,如果删除定义字体名称的描述符,层将具有原来的字体名称),所以我猜可以将这个巨大的函数缩小到几行,这些行只更改特定字母的大小,但我没有尝试这样做。我猜算法将如下所示:

  1. 使用DOM获取字体大小和文本;
  2. 将文本拆分为块(如from 0 to 1 + from 1 to last character更改第一个字母的字体大小);
  3. 设置具体块的参数;

如果文本层中已经存在几种样式,则会出现问题:您必须使用AM解析图层内容,获取所有块的所有样式才能找到您所引用的样式...

相关文章