Nov 9

ps使用js脚本进行批处理入门

Lrdcq , 2016/11/09 12:42 , 教程 , 閱讀(9799) , Via 本站原創
大家都知道Adobe家和Autodesk家的多媒体软件都支持使用简单的脚本来进行批处理操作。其中赫赫有名的是3dsmax等使用的maxscript,可谓是max建模套件标配;而在ps使用中,大家多半通过录制动作来完成大部分批处理操作,然后某一些需要数据按一定规律改变,或者需要随机数据加入的时候,动作功能就可能显得有些力不从心了。这时候,Adobe家的脚本批处理工具就可以大展拳脚了,而作为跨平台最方便了,当然是js。

简介

当然非常简单的批处理,在文件-脚本菜单选择对应的脚本就可以运行了。
在Photoshop中的脚本批处理是从CS2开始的,逐版有所更新API直到CS5为止,之后API再也没更新过。当然现在的API已经非常丰富了。
Adobe家的批处理其实都支持多门脚本语言,除了Javascript还包括在windows平台上支持VBScript和mac平台上支持AppleScript。显而易见这里面唯独Javascript是跨平台的,因此Javascript是使用最广泛的脚本编写语言。
脚本开发,就像office有专用的宏(VBS)开发工具箱一样,adobe也配置了专门的IDE,即Adobe ExtendScript Toolkit。它的功能包括基本的语言提示和API提示,也能对各个软件运行中的脚本进行断点调试,看到脚本上下文中的所有数据,简单来说还是非常完善的。当然下的盗版ps找不到这个工具,可以去adobe下载站单独下载。
脚本提供的api,除了每门语言基础的api之外,还包括3部分:
1.操作api,就像网页的dom讲ps界面元素(如图层,通道,各种工具箱)和其常用操作模型化。这也是批处理中最主要的api。
2.窗口api,可以用脚本构建一个窗口读写数据,编写用户可设置的脚本时会用到。
3.动作api,可以用特点的数据进行ps中所有,一切操作。这个问题最后讲解。

DEMO 1

当然hello world就免了,写js可以用alert弹出一些信息,如果不用调试工具的话这样做最方便。第一个demo我们来做图像旋转。我们的基础图像是这样的:
點擊在新視窗中瀏覽此圖片

我们来复制旋转它来做一个漂亮的花,我们应该怎么做呢,下面是实例代码:
var item = app.activeDocument.activeLayer;
var count = 18;
var angle = 360/count;

for(var i = 1; i < count; i++){ 
    var newItem = item.duplicate();
    newItem.rotate(angle * i, AnchorPosition.BOTTOMCENTER); 
};

最后运行出来效果是这样:
點擊在新視窗中瀏覽此圖片

来看看代码和运行过程,可以看到几个关键点:

1.app就像dom一样是全局环境数据的起点,通过它往下爬就可以取到ps的api里大部分的界面操作了。
2.rotate认的是角度不是弧度诶。
3.看运行时就能发现,js批处理实际是在操作界面工具而不是操作数据(但是在处理过程中不会渲染图像),因此受运行机器性能影响会比较严重。
不过这一段代码很清晰易懂,没什么问题。

DEMO 2

我们来做一下如下图效果:
點擊在新視窗中瀏覽此圖片

考虑制作过程,其中,每一个单位元素是一个圆,圆的直径随着y增加逐渐变小。另外圆的颜色通过某种方式映射对应一个彩色的色谱。根据这些,我们准备好素材:
點擊在新視窗中瀏覽此圖片

一个圆和一个背景。我们需要做的,就是复制这个圆到整个nxm的区域,更具当前位置背景颜色调整颜色,更具y轴位置调整大小。最后的代码如下:
var w = 1000, h = 800;
var div = 50;
var xc = w/div, yc = h/div;

var item = app.activeDocument.activeLayer;
var sampler = app.activeDocument.colorSamplers.add([0, 0]);

for (i = 1; i <= xc; i++) {
    for (j = 1; j <= yc; j++) {
        var posX = new UnitValue(i*div-1 + ' px');
        var posY = new UnitValue(j*div-1 + ' px');
        sampler.move([posX, posY]);
        var color = sampler.color;
        var newItem = item.duplicate();
        newItem.photoFilter(color, 100, false);
        newItem.translate(posX, posY);
        var s = (1100 - j*div) / 11; 
        newItem.resize(s, s, AnchorPosition.MIDDLECENTER);
    }
}

同样列举一下其中需要注意的地方:

1.使用到一个特殊的工具:sampler,其实就是ps的取色器。都说了我们都不能直接操作数据,因此要取得画面上的一个颜色,也只有用取色器才能办到。
2.ps中表示长度的都是使用的UnitValue对象,它的特点是携带了长度的单位信息,并且可以进行换算。比如我们可以直接计算的到"10 mm"+"2 cm"的数值。涉及到长度和px的转换则和当前document的dip有关。
3.在api中并不能找到上色的方法,包括直接绘制和图层颜色都没有,因此此处是用照片滤镜来处理的,反正执行的东西没差。
4.进行旋转缩放等变换操作,暂时定位点无法随意移动。

其他

看了上面这两个demo,应该能意识到,其实ps提供的操作api一点都不完善,很多常用的操作都没有,这怎么办呢。回想看看,事实上通过动作功能,我们可以录制完成全部操作的,能否通过动作来实现api中没有的操作脚本话呢。对,这是可以的,这就是动作api的主要设计目的。

具体的操作如下:

1.安装ScriptListener,然后录制自己想扒出来的操作,录制完成后,我们可以看到输出的操作数据,类似于如下脚本:
var id19 = charIDToTypeID( "Embs" );
var desc4 = new ActionDescriptor();
var id20 = charIDToTypeID( "Angl" );
desc4.putInteger( id20, angle );
var id21 = charIDToTypeID( "Hght" );
desc4.putInteger( id21, height );
var id22 = charIDToTypeID( "Amnt" );
desc7.putInteger( id22, amount );
executeAction( id19, desc4,DialogModes.NO );

虽然一脸蒙逼,但是我们清晰的看到我们需要的操作已经脚本化了。
2.仔细研读生成的脚本,寻找到自己需要的段落和需要改变的数据。
3.再把这段代码塞入原本的js脚本中作为一个函数或者方法,再使用就可以咯。

虽然确实比较繁琐,但是确实能有效解决问题。也许这就是adobe不更新api的原因了吧,新功能越来越多api越老越复杂,还不如用户自己去扒操作,自己去设计api呢。科科

相关教程相当罕见,参看adobe的原始pdf教程应该是最有意义的:http://www.adobe.com/cn/devnet/photoshop/scripting.html
logo