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的参考线、导入公共尾部(居底)
参考方法:
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脚本通信执行指令。
全面的介绍需要另起篇幅,不便于多作介绍,如有兴趣,请点击
 
学习资料:
posted @ 2012-06-25 09:41  cnwander  阅读(9337)  评论(0编辑  收藏  举报