30分钟上手Photoshop脚本

30分钟上手Photoshop脚本

本文目的:

30分钟之内让你明白如何利用Photoshop(以下简称PS)脚本编写常用插件或工具,提升工作效率。

如果你是前端工程师或视觉设计师,强烈建议你驻足30分钟,日后为人你节约的时间,或许是30天!

写在前面:

本文非扫盲贴,如果你还不清楚脚本与动作的区别,请自行搜索;

本文使用Javascript作为PS脚本开发语言,如果你还完全不懂Javascript,请 点击;

本文中的实例测试运行环境为Photoshop CS5,如何低于该版本,可能支持不完全。

PS脚本具体能干什么?

自动导入设计稿固定头尾部;

自动生成规定宽度的参考线;

提取PSD中的文本内容及样式;

自动导出ICON、按钮、切割背景图;

等等大部分操作都可以自动完成。

比如我已完成一个PSD2HTML插件iParser。

准备工作:

1、运行Adobe ExtendScript Toolkit(强烈推荐使用该编辑器,Adobe套装已默认安装)

2、新建文件并粘贴以下代码。

alert('恭喜!测试通过。');

3、保存至 Photoshop安装目录\Presets\Scripts,命名为test.jsx。

4、运行Photoshop,选择 文件>脚本>test 执行脚本。

如果看到了警告窗口,那你已经准备就绪。

实例一:入门

preferences.rulerUnits = Units.PIXELS;

var docRef = app.documents.add(200, 200);

var layer = docRef.artLayers.add();
layer.name = 'footer';

实例二:对话框

如果开发为插件,我们通常需要根据用户输入的信息执行脚本,这时候我们就需要用到对话框。

var dialogStr ="dialog { \

text:\ '新建模板',\

name:Group{\

label: StaticText {text:'名称:' }, \

input: EditText { preferredSize: [220, 20], text: 'test'} \

}\

}";

var win = new Window(dialogStr);

win.center();
win.show();

Photoshop对象模型:

和浏览器中的文档对象模型DOM类似,Photoshop也有它的对象模型:

常用类型与方法简介:

[Application](app):相当于浏览器中的window,它是对象模型的根,并提供访问所有其他对象的接口。

activeDocument[Document]:当前操作文档

documents[Documents]:当前打开文档的集合

preferences[Preferences]:首选项设置

executeAction:动作管理器。当你发现你要实现的功能没有直接的API时,你可能可以用它来完成,它提供了PS低级别的访问。

[Application]-[Document]:图层集合的容器

artLayers:艺术图层集合(最常见的普通图层)

layerSets:图层组集合

layers:包括artLayers与layerSets的集合

[Application]-[Document]-[ArtLayer]:操作最频繁的对象,访问图层信息,对图层的任何操作都能过这个对象

bounds:获取图层边界坐标

grouped:是否在图层组内

linkedLayers:链接的图层

textItem:获取图层中的文档需要通过textItem.contents

*参考文档见附件

请浏览一遍参考文档,并尝试完成一个工具:

题目:完成一个设计稿模板。功能点:自动导入公共头部(居顶)、生成980px的参考线、导入公共尾部(居底)

参考方法:

app.documents.add

doc[Document].guides.add

doc[Document].selection.select

doc[Document].selection.fill

doc[Document].selection.copy

layer[ArtLayer].textItem.*

file[File].*

color[SolidColor].*

layer[ArtLayer].move

常见问题解答:

如果你已经尝试用脚本完成一些功能,可能碰到了一些问题,比如PS的文档模型似乎并没想像中的完美,参考文档不详尽,甚至存在错误,那参考一下我曾碰到过的一些问题。

1、如何创建一个选区?

答:doc[Document].selection.select([[x1, y1], [x1, y2], [x2, y2], [x2, y1]]);

注:之所以把它当成一个问题,是因为文档中未提及具体参数,极易弄错。它的坐标顺序是(左上、左下、右下、右上)。

2、如何获取选中的图层/组?

答:这是一个学习过程中必犯的错误,你肯定会尝试doc[Document].activeLayer,但该方法只获取到当前激活的图层,并不能获取到所有选中的图层。

正确答案-

a、临时图层组中转(低效,低风险)。

getSelectedLayer: function(){

var A=[];

var desc11 = new ActionDescriptor();

var ref9 = new ActionReference();

ref9.putClass( stringIDToTypeID('layerSection') );

desc11.putReference( charIDToTypeID('null'), ref9 );

var ref10 = new ActionReference();

ref10.putEnumerated( charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );

desc11.putReference( charIDToTypeID('From'), ref10 );

executeAction( charIDToTypeID('Mk '), desc11, DialogModes.NO );

var gL = activeDocument.activeLayer.layers;

for(var i=0;i

A.push(gL[i]);

}

executeAction( charIDToTypeID('undo'), undefined, DialogModes.NO);

return A;

}

b、 设为链接图层中转。(高效,高风险)

getSelectedLayer: function(){

var selects = [app.activeDocument.activeLayer];

try {

var idlinkSelectedLayers = stringIDToTypeID( "linkSelectedLayers" );

var desc929 = new ActionDescriptor();

var idnull = charIDToTypeID( "null" );

var ref617 = new ActionReference();

var idLyr = charIDToTypeID( "Lyr " );

var idOrdn = charIDToTypeID( "Ordn" );

var idTrgt = charIDToTypeID( "Trgt" );

ref617.putEnumerated( idLyr, idOrdn, idTrgt );

desc929.putReference( idnull, ref617 );

executeAction( idlinkSelectedLayers, desc929, DialogModes.NO );

} catch(e) {}

if(selects[0].linkedLayers) selects = selects.concat(selects[0].linkedLayers);

return selects;

},

*注:以上代码可能暂时不能看懂,没关系,这些低层的数据访问,实践多了慢慢就懂了。

3、如何获取文本图层的颜色?

答:如果你用[ArtLayer].textItem.color,在实践中很难正确获取的文本颜色,因为设计师很可能是选择文本填充颜色的,这个颜色值在range上。

参考方法:

charIDToTypeID("Txt ") - 图层的文本数据

charIDToTypeID("Txtt") - 图层文本range数据

具体可参考我的另一篇文章,PS脚本函数库。

4、如何合并选中的图层?

答:

错误答案 - layer[ArtLayer].merge

正确答案 -

var idMrgtwo = charIDToTypeID( "Mrg2" );

executeAction( idMrgtwo, undefined, DialogModes.NO );

*面板开发(进阶)

如果我们开发的插件是需要用户不断在文档与插件之间进行操作,对话框已经不能满足需求了,那么我们需要用到面板。

由于面板编程涉及adobe air,可以先作大致了解,非必须掌握的内容。

如下图:

具体操作方式如下:

1、使用flex/builder开发flash面板,发布成extension-name.swf文件;

2、创建PS脚本 extension-name.jsx;

3、将extension-name.swf、extension-name.jsx放入Photoshop安装目录\Plug-ins\Panels\extension-name

原理:

Photoshop作为flash面板的宿主环境,flash与PS脚本通信执行指令。

全面的介绍需要另起篇幅,不便于多作介绍,如有兴趣,请点击。

学习资料:

官方论坛 - http://forums.adobe.com/community/photoshop/photoshop_scripting

民间论坛 - http://www.ps-scripts.com/

中文文档(不完整) - http://www.chforce.com/html/labs/PSScript/index.html

面板开发 - http://www.adobe.com/devnet-archive/photoshop/sdk/documentation/pages/index.html

as3中文手册 - http://help.adobe.com/zh_CN/FlashPlatform/reference/actionscript/3/

相关推荐