Photoshop脚本将文本层拆分为单词

问题描述

使用Photoshop 2017,我将文本图层拆分为单词:

enter image description here

使用以下脚本:

psd = app.activeDocument;
layer = psd.activeLayer;
var text = layer.textItem.contents;
var textArray = text.split(" ");
var lngth = textArray.length+1;
for (var w=1; w<lngth;w++){
    wordlayer = layer.duplicate();
    wordlayer.name = textArray[w-1];
    wordlayer.textItem.contents = textArray[w-1];
    psd.activeLayer = wordlayer;

}

哪个会产生以下结果:

enter image description here

正如您所知,我遇到的问题是定位。是否可以获取每个单词的原始坐标,以便我可以适当地定位每个文本层?

另一种可能的方法:我考虑过按原样复制每个图层,并将其他单词的颜色透明度更改为0%。我发现最接近的问题是这个 [ExtendScript]Change font color,size of certain word in text layer,但是即使这样做确实可行,仍然无法为单个单词设置alpha /透明度。

解决方法

您需要考虑前导(文本行中的垂直空间)和原始字体大小。这是您修改后的脚本。

// Switch off any dialog boxes
displayDialogs = DialogModes.NO; // OFF

psd = app.activeDocument;
layer = psd.activeLayer;
var text = layer.textItem.contents;
var textArray = text.split(" ");
var lngth = textArray.length+1;


for (var w=1; w<lngth;w++)
{
    wordlayer = layer.duplicate();
    wordlayer.name = textArray[w-1];
    wordlayer.textItem.contents = textArray[w-1];
    psd.activeLayer = wordlayer;
    var fontsize = wordlayer.textItem.size;
    var leading = wordlayer.textItem.leading;
    //alert("fontsize: " + fontsize + "\nleading: " + leading);
    translate(0,leading*(w-1));
}


// Switch off any dialog boxes
displayDialogs = DialogModes.ALL; // OFF

function translate(x,y)
{
  // =======================================================
  var idTrnf = charIDToTypeID( "Trnf" );
  var desc179 = new ActionDescriptor();
  var idnull = charIDToTypeID( "null" );
  var ref38 = new ActionReference();
  var idLyr = charIDToTypeID( "Lyr " );
  var idOrdn = charIDToTypeID( "Ordn" );
  var idTrgt = charIDToTypeID( "Trgt" );
  ref38.putEnumerated( idLyr,idOrdn,idTrgt );
  desc179.putReference( idnull,ref38 );
  var idFTcs = charIDToTypeID( "FTcs" );
  var idQCSt = charIDToTypeID( "QCSt" );
  var idQcsa = charIDToTypeID( "Qcsa" );
  desc179.putEnumerated( idFTcs,idQCSt,idQcsa );
  var idOfst = charIDToTypeID( "Ofst" );
  var desc180 = new ActionDescriptor();
  var idHrzn = charIDToTypeID( "Hrzn" );
  var idPxl = charIDToTypeID( "#Pxl" );
  desc180.putUnitDouble( idHrzn,idPxl,x ); // x 
  var idVrtc = charIDToTypeID( "Vrtc" );
  var idPxl = charIDToTypeID( "#Pxl" );
  desc180.putUnitDouble( idVrtc,y ); // y
  var idOfst = charIDToTypeID( "Ofst" );
  desc179.putObject( idOfst,idOfst,desc180 );
  var idIntr = charIDToTypeID( "Intr" );
  var idIntp = charIDToTypeID( "Intp" );
  var idbicubicAutomatic = stringIDToTypeID( "bicubicAutomatic" );
  desc179.putEnumerated( idIntr,idIntp,idbicubicAutomatic );
  executeAction( idTrnf,desc179,DialogModes.NO );
}

在创建textArray时,您可能需要考虑单词之间的间距以及换行符。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...