构建一个Photoshop脚本,将文本图层添加到这批照片中

时间:2019-02-07 08:16:13

标签: javascript javascript-objects photoshop photoshop-script

注意:我的photoshop是CS6
我受命创建一个可以处理一堆照片的脚本,并为每张照片添加文本。

我有一个类似这样的数据(文本列表记事本示例): 徽标文件
'型号'
“型号”

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.创建一个新的文本层,放置在徽标上方
6.导出为jpg,重命名为相同的型号
7.删除所有图层或关闭文档
8.从步骤1重复

from this
to this - goal

这是我所做的:

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应用程序。因此数据来自我工作簿上的表格。但是现在,仅导入图像会让我头晕。

我忘了问:
1.如何将图像导入到活动文档层中?
2.如何从js中的字符串数组检查子字符串?就像当我发现单词“ logo *”时一样,然后执行if语句。

非常感谢您提供的任何解决方案,帮助和帮助。
谢谢。

尤里

1 个答案:

答案 0 :(得分:0)

有一个名为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
}