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();<br>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();<br>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的参考线、导入公共尾部(居底)
功能点:自动导入公共头部(居顶)、生成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<gL.length;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://www.ps-scripts.com/
作者:万技师
出处:http://www.cnblogs.com/wanbo/
转载请在明显位置注明原文链接,否则保留追究法律责任的权利。