30分钟上手Photoshop脚本
本文目的:
30分钟之内让你明白如何利用Photoshop(以下简称PS)脚本编写常用插件或工具,提升工作效率。
如果你是前端工程师或视觉设计师,强烈建议你驻足30分钟,日后为人你节约的时间,或许是30天!
写在前面:
本文非扫盲贴,如果你还不清楚脚本与动作的区别,请自行搜索;
本文使用Javascript作为PS脚本开发语言,如果你还完全不懂Javascript,请 点击;
本文中的实例测试运行环境为Photoshop CS5,如何低于该版本,可能支持不完全。
PS脚本具体能干什么?
自动导入设计稿固定头尾部;
自动生成规定宽度的参考线;
提取PSD中的文本内容及样式;
自动导出ICON、按钮、切割背景图;
等等大部分操作都可以自动完成。
比如我已完成一个PSD2HTML插件iParser。
准备工作:
1、运行Adobe ExtendScript Toolkit(强烈推荐使用该编辑器,Adobe套装已默认安装)
2、新建文件并粘贴以下代码。
1 | alert( '恭喜!测试通过。' ); |
3、保存至 Photoshop安装目录\Presets\Scripts,命名为test.jsx。
4、运行Photoshop,选择 文件>脚本>test 执行脚本。
如果看到了警告窗口,那你已经准备就绪。
实例一:入门
1 2 3 | preferences.rulerUnits = Units.PIXELS; var docRef = app.documents.add(200, 200); var layer = docRef.artLayers.add();<br>layer.name = 'footer' ; |
实例二:对话框
如果开发为插件,我们通常需要根据用户输入的信息执行脚本,这时候我们就需要用到对话框。
1 2 3 4 5 6 7 8 9 | 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的参考线、导入公共尾部(居底)
参考方法:
1 2 3 4 5 6 7 8 9 | 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、临时图层组中转(低效,低风险)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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、 设为链接图层中转。(高效,高风险)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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
正确答案 -
1 2 | 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/
转载请在明显位置注明原文链接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?