在Photoshop中使用Java脚本修改文本项的内容
我知道如何使用下面这样的代码在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 );
我知道可以删除大多数多余的描述符(例如,如果删除定义字体名称的描述符,层将具有原来的字体名称),所以我猜可以将这个巨大的函数缩小到几行,这些行只更改特定字母的大小,但我没有尝试这样做。我猜算法将如下所示:
- 使用DOM获取字体大小和文本;
- 将文本拆分为块(如
from 0 to 1 + from 1 to last character
更改第一个字母的字体大小); - 设置具体块的参数;
如果文本层中已经存在几种样式,则会出现问题:您必须使用AM解析图层内容,获取所有块的所有样式才能找到您所引用的样式...
相关文章