【问题标题】:Photoshop script to split text layer into words将文本层拆分为单词的 Photoshop 脚本
【发布时间】:2020-12-15 00:50:10
【问题描述】:

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

使用以下脚本:

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;

}

产生这个结果:

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

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

【问题讨论】:

  • 我正在画一些复杂的思维导图。这个脚本非常有用!谢谢分享

标签: javascript jsx extendscript photoshop-script


【解决方案1】:

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

// 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, idPxl, 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 时,您可能需要考虑单词之间的空格以及换行符。

【讨论】:

  • 谢谢,但它似乎无法识别 x 坐标:!result
  • 那是因为它是另一层复杂性。您需要另一个函数来计算每个单词的宽度,可能基于每个单词layer bounds。
猜你喜欢
  • 1970-01-01
  • 2010-10-21
  • 2017-10-05
  • 1970-01-01
  • 2013-01-12
  • 2021-10-16
  • 2010-10-13
  • 2016-09-16
  • 2021-07-22
相关资源
最近更新 更多