构建一个 photoshop 脚本来为这批照片添加一个文本层
Build a photoshop script to add a text layer to the batch of photos
注:我的photoshop是cs6
我奉命创建一个适用于一堆照片的脚本,并为每张照片添加一个文本。
我有这样的数据(文本列表记事本示例):
'logo file'
'model number'
'model number'
logo accuride.jpg
acc-899
acc-567
acc-776
logo bocsh.jpg
boc-777
boc-699
boc-563
logo dell.jpg
65777
89992
45663
基本上,我已经想到了步骤:
1.找到记事本(列表)
2. 阅读并解析列表。要知道什么标志和写什么
3. 在图书馆拍张照片(即标志accuride.jpg)
4.放入活动文档层
5.新建文字层,放在logo上面
6.导出为jpg,重命名为型号相同
7.删除所有图层或关闭文档
8. 从步骤 1 开始重复
这是我所做的:
var doc = activeDocument
var textFile = new File(Folder.desktop+ '/model-number.txt');
var list = readText (textFile).split('\n');
for (var j = 0; i<list.length; i++) {
if (list[j].some("logo")) { //jika list j contain kata "logo" maka :
var artLayerRef = doc.artLayers.add()
artLayerRef.kind = LayerKind.TEXT;
var textItemRef = artLayerRef.textItem;
textItemRef.contents = list[i]
}
}
function readText(file){
if (textFile.exists) {
textFile.encoding = "ANSI";
textFile.lineFeed = "unix";
textFile.open("r", "TEXT", "????");
var str = textFile.read();
textFile.close();
return str;
}
}
事实是,我是这个 js 的新手,尤其是对于 photoshop 脚本。通常我会创建一个 vba 脚本来支持我的拼贴画。
我只花了 2 个多小时来弄清楚如何将图像导入活动文档层,但仍然没有成功。
我还想象使用 vba 来调用 photoshop 应用程序。所以数据来自我工作簿上的table。可是现在光是导入一张图就头晕了
忘记问了:
1. 如何将图片导入活动文档的图层?
2.如何在js中检查字符串数组中的子字符串?就像当我找到单词 "logo*" 然后执行 if 语句。
非常感谢您的任何解决方案、协助和帮助。
谢谢。
尤里
有一个名为 ScriptListener 的 Photoshop 插件,安装后,Photoshop 将开始编写您在 Photoshop 中执行的大部分动作作为 Action Manager Javascript 代码。这是为您在 Scripting References pdf 中找不到的内容查找代码的方法之一。例如,要导入图像,您可以执行 File > Place Embedded
,加载选区以确定其边界框,裁剪到该选区并取消选择。这些操作将在您的桌面上的 ScriptingListenerJS.log 中为您提供此代码:
// =======================================================
var idPlc = charIDToTypeID( "Plc " );
var desc7 = new ActionDescriptor();
var idIdnt = charIDToTypeID( "Idnt" );
desc7.putInteger( idIdnt, 12 );
var idnull = charIDToTypeID( "null" );
desc7.putPath( idnull, new File( "/C/Users/Sergey Kritskiy/Desktop/temp/triangles.png" ) );
var idFTcs = charIDToTypeID( "FTcs" );
var idQCSt = charIDToTypeID( "QCSt" );
var idQcsa = charIDToTypeID( "Qcsa" );
desc7.putEnumerated( idFTcs, idQCSt, idQcsa );
var idOfst = charIDToTypeID( "Ofst" );
var desc8 = new ActionDescriptor();
var idHrzn = charIDToTypeID( "Hrzn" );
var idPxl = charIDToTypeID( "#Pxl" );
desc8.putUnitDouble( idHrzn, idPxl, 0.000000 );
var idVrtc = charIDToTypeID( "Vrtc" );
var idPxl = charIDToTypeID( "#Pxl" );
desc8.putUnitDouble( idVrtc, idPxl, 0.000000 );
var idOfst = charIDToTypeID( "Ofst" );
desc7.putObject( idOfst, idOfst, desc8 );
executeAction( idPlc, desc7, DialogModes.NO );
// =======================================================
var idsetd = charIDToTypeID( "setd" );
var desc9 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref1 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idfsel = charIDToTypeID( "fsel" );
ref1.putProperty( idChnl, idfsel );
desc9.putReference( idnull, ref1 );
var idT = charIDToTypeID( "T " );
var ref2 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idChnl = charIDToTypeID( "Chnl" );
var idTrsp = charIDToTypeID( "Trsp" );
ref2.putEnumerated( idChnl, idChnl, idTrsp );
desc9.putReference( idT, ref2 );
executeAction( idsetd, desc9, DialogModes.NO );
// =======================================================
var idCrop = charIDToTypeID( "Crop" );
var desc11 = new ActionDescriptor();
var idDlt = charIDToTypeID( "Dlt " );
desc11.putBoolean( idDlt, true );
executeAction( idCrop, desc11, DialogModes.NO );
// =======================================================
var idsetd = charIDToTypeID( "setd" );
var desc13 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref3 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idfsel = charIDToTypeID( "fsel" );
ref3.putProperty( idChnl, idfsel );
desc13.putReference( idnull, ref3 );
var idT = charIDToTypeID( "T " );
var idOrdn = charIDToTypeID( "Ordn" );
var idNone = charIDToTypeID( "None" );
desc13.putEnumerated( idT, idOrdn, idNone );
executeAction( idsetd, desc13, DialogModes.NO );
它很难读,有一些实用程序可以帮助美化它一点(比如 xbytor's xtools 中的 SLCFix.js
),但它完成了工作,你可以看到你想要的字符串需要替换以放置一个将文件放入文档的函数。
2) 对于您的字符串和徽标,我想有不同的方法可以做到这一点,我会这样做:
var list = readText(textFile).split('\n'),
curLogo = "",
logos = {};
for (var i = 0; i < list.length; i++)
{
var curLine = list[i].match(/logo.*\.jpg/);
if (curLine != null)
{
curLogo = list[i];
logos[curLogo] = [];
}
else
{
logos[curLogo].push(list[i])
}
}
这会给你一个这样的对象,你可以稍后使用
// {
// "logo accuride.jpg": [
// "acc-899",
// "acc-567",
// "acc-776"
// ],
// "logo bocsh.jpg": [
// "boc-777",
// "boc-699",
// "boc-563"
// ],
// "logo dell.jpg": [
// "65777",
// "89992",
// "45663"
// ]
// }
for (var logo in logos)
{
$.writeln(logo) // logo accuride.jpg
$.writeln(logos[logo].length) // 3
}
注:我的photoshop是cs6
我奉命创建一个适用于一堆照片的脚本,并为每张照片添加一个文本。
我有这样的数据(文本列表记事本示例):
'logo file'
'model number'
'model number'
logo accuride.jpg
acc-899
acc-567
acc-776
logo bocsh.jpg
boc-777
boc-699
boc-563
logo dell.jpg
65777
89992
45663
基本上,我已经想到了步骤:
1.找到记事本(列表)
2. 阅读并解析列表。要知道什么标志和写什么
3. 在图书馆拍张照片(即标志accuride.jpg)
4.放入活动文档层
5.新建文字层,放在logo上面
6.导出为jpg,重命名为型号相同
7.删除所有图层或关闭文档
8. 从步骤 1 开始重复
这是我所做的:
var doc = activeDocument
var textFile = new File(Folder.desktop+ '/model-number.txt');
var list = readText (textFile).split('\n');
for (var j = 0; i<list.length; i++) {
if (list[j].some("logo")) { //jika list j contain kata "logo" maka :
var artLayerRef = doc.artLayers.add()
artLayerRef.kind = LayerKind.TEXT;
var textItemRef = artLayerRef.textItem;
textItemRef.contents = list[i]
}
}
function readText(file){
if (textFile.exists) {
textFile.encoding = "ANSI";
textFile.lineFeed = "unix";
textFile.open("r", "TEXT", "????");
var str = textFile.read();
textFile.close();
return str;
}
}
事实是,我是这个 js 的新手,尤其是对于 photoshop 脚本。通常我会创建一个 vba 脚本来支持我的拼贴画。
我只花了 2 个多小时来弄清楚如何将图像导入活动文档层,但仍然没有成功。
我还想象使用 vba 来调用 photoshop 应用程序。所以数据来自我工作簿上的table。可是现在光是导入一张图就头晕了
忘记问了:
1. 如何将图片导入活动文档的图层?
2.如何在js中检查字符串数组中的子字符串?就像当我找到单词 "logo*" 然后执行 if 语句。
非常感谢您的任何解决方案、协助和帮助。
谢谢。
尤里
有一个名为 ScriptListener 的 Photoshop 插件,安装后,Photoshop 将开始编写您在 Photoshop 中执行的大部分动作作为 Action Manager Javascript 代码。这是为您在 Scripting References pdf 中找不到的内容查找代码的方法之一。例如,要导入图像,您可以执行 File > Place Embedded
,加载选区以确定其边界框,裁剪到该选区并取消选择。这些操作将在您的桌面上的 ScriptingListenerJS.log 中为您提供此代码:
// =======================================================
var idPlc = charIDToTypeID( "Plc " );
var desc7 = new ActionDescriptor();
var idIdnt = charIDToTypeID( "Idnt" );
desc7.putInteger( idIdnt, 12 );
var idnull = charIDToTypeID( "null" );
desc7.putPath( idnull, new File( "/C/Users/Sergey Kritskiy/Desktop/temp/triangles.png" ) );
var idFTcs = charIDToTypeID( "FTcs" );
var idQCSt = charIDToTypeID( "QCSt" );
var idQcsa = charIDToTypeID( "Qcsa" );
desc7.putEnumerated( idFTcs, idQCSt, idQcsa );
var idOfst = charIDToTypeID( "Ofst" );
var desc8 = new ActionDescriptor();
var idHrzn = charIDToTypeID( "Hrzn" );
var idPxl = charIDToTypeID( "#Pxl" );
desc8.putUnitDouble( idHrzn, idPxl, 0.000000 );
var idVrtc = charIDToTypeID( "Vrtc" );
var idPxl = charIDToTypeID( "#Pxl" );
desc8.putUnitDouble( idVrtc, idPxl, 0.000000 );
var idOfst = charIDToTypeID( "Ofst" );
desc7.putObject( idOfst, idOfst, desc8 );
executeAction( idPlc, desc7, DialogModes.NO );
// =======================================================
var idsetd = charIDToTypeID( "setd" );
var desc9 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref1 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idfsel = charIDToTypeID( "fsel" );
ref1.putProperty( idChnl, idfsel );
desc9.putReference( idnull, ref1 );
var idT = charIDToTypeID( "T " );
var ref2 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idChnl = charIDToTypeID( "Chnl" );
var idTrsp = charIDToTypeID( "Trsp" );
ref2.putEnumerated( idChnl, idChnl, idTrsp );
desc9.putReference( idT, ref2 );
executeAction( idsetd, desc9, DialogModes.NO );
// =======================================================
var idCrop = charIDToTypeID( "Crop" );
var desc11 = new ActionDescriptor();
var idDlt = charIDToTypeID( "Dlt " );
desc11.putBoolean( idDlt, true );
executeAction( idCrop, desc11, DialogModes.NO );
// =======================================================
var idsetd = charIDToTypeID( "setd" );
var desc13 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref3 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idfsel = charIDToTypeID( "fsel" );
ref3.putProperty( idChnl, idfsel );
desc13.putReference( idnull, ref3 );
var idT = charIDToTypeID( "T " );
var idOrdn = charIDToTypeID( "Ordn" );
var idNone = charIDToTypeID( "None" );
desc13.putEnumerated( idT, idOrdn, idNone );
executeAction( idsetd, desc13, DialogModes.NO );
它很难读,有一些实用程序可以帮助美化它一点(比如 xbytor's xtools 中的 SLCFix.js
),但它完成了工作,你可以看到你想要的字符串需要替换以放置一个将文件放入文档的函数。
2) 对于您的字符串和徽标,我想有不同的方法可以做到这一点,我会这样做:
var list = readText(textFile).split('\n'),
curLogo = "",
logos = {};
for (var i = 0; i < list.length; i++)
{
var curLine = list[i].match(/logo.*\.jpg/);
if (curLine != null)
{
curLogo = list[i];
logos[curLogo] = [];
}
else
{
logos[curLogo].push(list[i])
}
}
这会给你一个这样的对象,你可以稍后使用
// {
// "logo accuride.jpg": [
// "acc-899",
// "acc-567",
// "acc-776"
// ],
// "logo bocsh.jpg": [
// "boc-777",
// "boc-699",
// "boc-563"
// ],
// "logo dell.jpg": [
// "65777",
// "89992",
// "45663"
// ]
// }
for (var logo in logos)
{
$.writeln(logo) // logo accuride.jpg
$.writeln(logos[logo].length) // 3
}