×

工业设计互动平台

手机短信,快捷登录

QQ登录

只需一步,快速开始

Photoshop高手之路 - Photoshop Script介绍

发布于 2013-12-14 2 点赞 10 评论 7013 浏览

这是我花很长时间整理的资料,希望能给大家的设计带来帮助!

对于每个设计师来讲自动化都是非常有用的,它可以迅速简单的解决问题,节省很多宝贵的时间。

今天,我为您介绍一种先进的自动化技术:脚本。你需要的是具备JavaScript的知识,其中一些我们的Web设计师已经有了基本的了解。

其实我前几年就已经对Photoshop scripts有所了解,但是最近才深入研究了一下,我一直避免使用它,因为我认为这是属于程序员的工作。但是我错了,今天我将表明虽然它需要一些基本的编程技巧,但是脚本并不难掌握。
但是首先,我们将回答学习者的几个疑惑。

我们为什么需要脚本?

为什么我们会学习到脚本,Photoshop中已经有相当不错的功能了?答案是交互性。当你使用一个操作,你不能真正控制它的行为在不同情况下;它就像我们在播放一部电影,反复不断的播放,却没有任何改变。
脚本是更加动态,根据你的参数输入或应用程序的上下文的变化做出不同的操作。听起来很有用,不是吗?

必要技能

其实你并不需要具备高级程序员的能力,就可以开始写脚本了;我也仅仅是个设计师,和你一样。但是你至少需要了解JavaScript的基础知识。
如果你不懂JavaScript,也不用害怕,有需要学习的地方,比如 Codecademy, 有许多互动式教学的课程。
我使用的是Adobe Photoshop CS5, 但是对于更新的版本也是一样适用的。 Adobe在CS5之后的版本并没有对API有过多的更新。我参考的也是CS6的脚本文档。so,follow me!

开始学习

当你在Photoshop记录操作时,按照你指定的步骤完成预期的结果--这就是你的算法。然后,你点击Record,在Photoshop中一步一步重复这些操作。脚本是相似的,只不过是通过你编写的代码来代替这些步骤,大多数的Photoshop的操作在脚本中都有相对应的函数。
让我们看看这样一个操作,将一个文档的尺寸放大到150%,我们可以通过下面的操作来实现:
  • 打开 Image → Image Size.
  • 按下 150% 在width 和 height.
  • 点击 “OK.”


我们使用脚本的处理过程如下:
  • 调用application: app
  • 指向当前的文档: activeDocument
  • 调用函数来修改尺寸: resizeImage(width, height)


代码如下所示:
  1. app.activeDocument.resizeImage("150%", "150%");
复制代码
编程语言

有三种编程语言来编写Photoshop脚本:Mac上的AppleScript,Windows系统上的VBScript, 可以运行在所有平台的JavaScript,使用JavaScript的原因是,它是跨平台的,并且我对它有一些使用经验。


工具

Adobe提供了一个非常实用的脚本编辑器ExtendedScript Toolkit.

Adobe ExtendedScript Toolkit的窗口。
这个工具是Photoshop自带的,我们可以在下面的路径中找到它:
  • Mac OS X
    /Applications/Utilities/Adobe Utilities CS6/ExtendScript Toolkit CS6/
  • Windows
    C:\Program Files\Adobe\Adobe Utilities - CS6\ExtendScript Toolkit CS6
    (or Program Files (x86) for 64-bit machines)


ExtendedScript Toolkit用户界面是非常简单漂亮的。开始编写脚本,在下图中的下拉菜单选择对于的应用,如果Photoshop启动了,铁链标志将会显示绿色。


现在我们可以在里面编写
  1. alert("Hello Photoshop!");
复制代码
按下 cmd + R (或者在工具栏中点击 “Play” ) 运行你的脚本。ExtendedScript Toolkit会切换到Photoshop然后显示一个如下面的弹出框:


ExtendedScript Toolkit具有很棒的debugg功能,我们可以使用 Help → JavaScript Tools Guide来学习更多的编辑器功能的使用。

你也可以使用任何的文本编辑器来编写脚本,只需保存为 .jsx 文件。运行脚本,我们在Photoshop中打开 File → Scripts → Browse 选中你的脚本。或者你在脚本的顶部协商下面的代码,默认就会使用Photoshop打开:
  1. #target photoshop
复制代码

保存你的脚本在 Photoshop/Presets/Scripts/ 目录,访问文件打开 File → Scripts 。我们也可以设置快捷键,打开 Edit → Keyboard Shortcuts, 在 File → Scripts → [your script’s name], 设置你需要的快捷键。

ExtendedScript Toolkit可以在这个开发环境中运行和debug代码,并且有一个内置对象模型查看器,这是非常有用的。 所以我强烈建议大家使用它来编写脚本,在Mac版本中有时候会出现崩溃的情况,所以大家注意一下。


PHOTOSHOP对象模型

为了更容易的编写脚本,我们需要明白Photoshop的 Document Object Model (DOM)所涉及的一些东西。明白它并不是很难的。Photoshop’s DOM主要的对象是application(应用),其实就是整个Photoshop软件本身,在application中保存了我们在Photoshop打开的所有文档(图片)。

每个文档又包括很多元素 — 例如图层layers (称为 ArtLayers), 图层组 (LayerSets), 通道, 历史状态等等 — 就像一个完整的PSD document文档。

我们将Photoshop的DOM简化如下图所示。 更多的细节我们可以在 “Adobe Photoshop CS6 Scripting Guide” (PDF)的第12页看到。


Photoshop’s DOM 简化图示

我们可以使用这些对象的属性和方法,例如,修改选中图层的透明度,获取这个方法的过程是 Application → Document → Layer → Opacity 然后设置指定值。代码如下:
  1. app.activeDocument.activeLayer.opacity = 50;
复制代码
和你猜测的是一样的, activeDocument 和 activeLayer 分别代表当前选中的文档和图层。

Y我们可以找到所有对象的属性和方法在 “Adobe Photoshop CS6 JavaScript Scripting Reference” (PDF)里面,或者使用ExtendedScript Toolkit打开 Help → Object Model Viewer来查看。

让我们来看一个真实的实例,下面的内容,我们将会自己写一个操作的脚本。


将旋转操作写成一个脚本

在好久以前的圣诞节,我需要一个方法来帮助我画一个雪花。
PHOTOSHOP画雪花教程
  • 画雪花其中一个部分的图案
  • 复制图案,将它向右旋转一点
  • 重复第二步,直到你画出一个完整的雪花


复制和旋转每个小图案是非常单调乏味的操作,所以我使用了 action to automate it. 它的算法如下所示:
  • 复制小图案
  • 旋转你指定的角度,使用 Transform 工具
  • 复制图层
  • 使用“Repeat Transform” 函数
  • 重复第4和第5步直到做出完整的雪花。


相对棒的操作,但是有一个缺点。我们在第二部指定一个固定的角度,所以生成的雪花瓣的数量就是固定值了。
以前我不懂脚本,所以我只能多次重复这个过程,指定不同的角度得到不同的雪花瓣
今天, 我们将实现这个动态操作,会有一个弹出框设定你需要雪花瓣的数量,开始吧!


算法
当你开始编写脚本之前,定义一个算法是一个非常好的习惯,在这个例子中,我们的算法如下:
  • 提示用户输入雪花瓣的数量
  • 计算旋转角度
  • 复制和旋转在第一步得到的图层数量


开始保存当前或者选中的图层作为对象,方便后面使用:
  1. var originalStem = app.activeDocument.activeLayer;
复制代码
注意在Javascript中,我们使用双斜线(//)表示后面的内容是注释,主要用来描述代码的作用,对于脚本是没有任何影响的。
现在我们要实现我们的算法:

1. 提示用户输入雪花瓣的数量

弹出一个对话框提示用户输入值可以使用 prompt(message, default value[, title]) 函数。这个函数显示一个对话框并且带有message 和一个文本框字段包含 default value, 当用户点击 “OK,”函数返回用户输入的值,所以我们必须要保存用户输入的值。
var stemsAmount = prompt("Processing \""+originalStem.name+"\"\nHow many stems do you need?", 12);
注意,我使用了 originalStem.name 在信息中,所以对话框中会显示选中图层的名称。

在 Mac OS X中,第一行的信息会是粗体,第二行是主要的信息,这里使用 \n来换行。
在Windows中, 你可以设置在函数中设置第三个参数作为标题,如下:
  1. var stemsAmount = prompt("How many stems do you need?", 12, "Processing "+originalStem.name);
复制代码
如果我们在Photoshop中运行代码,它将显示下面的对话框:


当用户点击“OK,” 输入框中的值将会保存在 stemsAmount 变量中,如果用户点击 “Cancel,”函数将会返回 null ,也就是空值,后面我们将会使用到。

2. 计算旋转角度
计算选择的角度应该是非常简单的,我们只需要使用360除以上一步用户输入的需要雪花瓣数量就可以了:
  1. angle = 360 / stemsAmount;
复制代码
3. 复制和旋转
现在我们需要复制雪花瓣,为实现复制,我们要使用到 for循环:
  1. for(var i = 1; i < stemsAmount; i++){        // 代码将会运行"stemAmount - 1"次 };
复制代码
复制和旋转图层,我们将使用到 duplicate() 和  rotate(angle, AnchorPosition)方法:  angle 的值就是角度乘以旋转的次数, AnchorPosition 代表图层围绕旋转的点。这个点我们可以在使用旋转用具的时候看到-里面有一个小的十字架,在脚本中,它有9个特殊的值,如下图所示:

在我们的使用中,我们需要的是底部的中心值 BOTTOMCENTER。Photoshop中的其他常量和函数在第197页 “Adobe Photoshop CS6 JavaScript Reference” (PDF).

我们的 for循环会如下:
  1. for(var i = 1; i < stemsAmount; i++){
  2.         var newStem = originalStem.duplicate();
  3.         newStem.rotate(angle * i, AnchorPosition.BOTTOMCENTER);
  4.         };
复制代码
完成的代码如下所示,你可以试着运行它:
  1. // Save selected layer to variable:
  2. var originalStem = app.activeDocument.activeLayer;

  3. // Ask user for input by showing prompt box and save inputted value to variable:
  4. var stemsAmount = prompt("Processing ""+originalStem.name+""\nHow many stems do you need?", 12);

  5. // Calculate the rotation angle:
  6. var angle = 360 / stemsAmount;

  7. // Duplicate and rotate layers:
  8. for(var i = 1; i < stemsAmount; i++){
  9.         // Duplicate original layer and save it to the variable
  10.         var newStem = originalStem.duplicate();

  11.         // Rotate new layer
  12.         newStem.rotate(angle * i, AnchorPosition.BOTTOMCENTER);
  13. };
复制代码

后期处理

我通常会尝试实现与脚本的主要目标,而当一切工作正常,我将开始提炼的代码。在我们的例子中,我们必须确保用户在提示框中输入一个有效的数字 - 即一个正整数,大于1的值。
此外,为了防止Photoshop崩溃,我们将限制雪花瓣的数量 - 比方说,100。要做到这一点,我们将使用一个while循环来显示用户在提交无效的情况下显示错误信息,并且提示框会继续显示,直到用户输入一个有效的值,或点击“取消”按钮(记得如果用户点击“取消”)的提示下返回null。
新的代码如下所示:
  1. // Save selected layer to variable:
  2. var originalStem = app.activeDocument.activeLayer;

  3. // Ask user for input by showing prompt box and save inputted value to variable:
  4. var stemsAmount = prompt ("Processing ""+originalStem.name+""\nHow many stems do you need? (From 2 to 100)", 12);

  5. // Check that user entered a valid number and, if invalid, show error message and ask for input again
  6. while(isNaN(stemsAmount) || stemsAmount <= 0 || stemsAmount > 100){
  7.         // If user clicks "Cancel" button, then exit loop
  8.         if(stemsAmount == null) break;

  9.         // Show error message…
  10.         alert("Please enter number in range from 2 to 100");
  11.         // …and ask for input again
  12.         stemsAmount = prompt("Processing ""+originalStem.name+""\nHow many stems do you need? (From 2 to 100)", 12);
  13. };

  14. // Run the copying process
  15. if(stemsAmount != null){
  16.         // Calculate the rotation angle
  17.         var angle = 360 / parseInt(stemsAmount);

  18.         // Duplicate and rotate layers:
  19.         for(var i = 1; i < stemsAmount; i++){
  20.                 // Duplicate original layer and save it to the variable
  21.                 var newStem = originalStem.duplicate();

  22.                 // Rotate new layer
  23.                 newStem.rotate(angle * i, AnchorPosition.BOTTOMCENTER);
  24.         };
  25. };
复制代码
你可以已经注意到,我们使用了 isNaN(value) 函数,它会返回 true 如果 value  “不是一个数值” , parseInt(value) 会转化 value 成一个整数值,因为我们计算角度的需要。

下一步我们将会管理图层,我们使用索引重命名图层。此外,以确保我们不要弄乱文件的图层,让我们把雪花瓣放置到一组。

重命名图层不是一个困难的任务,我们使用图层的 name 属性,并且给它添加索引值:
  1. newStem.name = originalStem.name + " " + (i+1);
复制代码
Photoshop的 API称为 LayerSet 我们访问文档所有图层组要调用 layerSets 的属性,添加新的群组,我们调用layerSet的方法 add()
  1. var stemsGroup = app.activeDocument.layerSets.add();
  2. stemsGroup.name = originalStem.name + " ("+stemsAmount+" stems)";
复制代码
然后,我们添加图层到图层组中,使用 move(relativeObject, ElementPlacement)函数。
ElementPlacement 是一个常量,这个决定我们如何将我们的层相对的地方......嗯,relativeObject。在我们的例子中,我们将使用ElementPlacement.INSIDE将原图层放置到一个组中
  1. originalStem.move(stemsGroup, ElementPlacement.INSIDE);
复制代码
我们将放置每个图层的副本在图层组的底部使用ElementPlacement.PLACEATEND,所有的图层就会按顺序放在图层中了:
  1. newStem.move(stemsGroup, ElementPlacement.PLACEATEND);
复制代码
你可以阅读更多 ElementPlacement 常量的信息在第202页 “Adobe Photoshop CS6 JavaScript Reference” (PDF).


最终代码
大功告成! RotateMe.jsx 已经完成了,最终的代码如下:
  1. // 将选中的图层保存到变量originalStem中
  2. var originalStem = app.activeDocument.activeLayer;

  3. // 提示用户输入值,然后将获取的值保存到变量stemsAmount中
  4. var stemsAmount = prompt("Processing ""+originalStem.name+""\nHow many stems do you need?", 12);

  5. // 处理用户输入的值是否有效,如果无效将会显示错误信息,并且在此显示提示框
  6. while(isNaN(stemsAmount) || stemsAmount <= 0 || stemsAmount > 100){
  7.         // 用户是否点击了"Cancel"按钮,如果是,就会推出循环
  8.         if(stemsAmount == null) break;

  9.         // 显示错误信息
  10.         alert("Please enter number in range from 2 to 100");
  11.         // 再次提示用户输入值
  12.         stemsAmount = prompt("Processing ""+originalStem.name+""\nHow many stems do you need? (From 2 to 100)", 12);
  13. };

  14. // 运行复制处理
  15. if(stemsAmount != null){
  16.         // 计算选择角度
  17.         var angle = 360 / parseInt(stemsAmount);

  18.         // 创建图层组
  19.         var stemsGroup = app.activeDocument.layerSets.add();
  20.                 stemsGroup.name = originalStem.name + " ("+stemsAmount+" stems)";
  21.         // 将原始图放入图层组
  22.         originalStem.move(stemsGroup, ElementPlacement.INSIDE);

  23.         // 复制和旋转图层
  24.         for(var i = 1; i < stemsAmount; i++){
  25.                 // 复制原始图层保存到变量中
  26.                 var newStem = originalStem.duplicate();

  27.                 // 旋转新图层
  28.                 newStem.rotate(angle * i, AnchorPosition.BOTTOMCENTER);

  29.                 // 添加索引到图层
  30.                 newStem.name = originalStem.name + " " + (i+1);

  31.                 // 放置新的图层到图层组
  32.                 newStem.move(stemsGroup, ElementPlacement.PLACEATEND);
  33.         };

  34.         // 添加索引到原始图层
  35.         originalStem.name += " 1";
  36. };
复制代码



现在你将文件放置到 Photoshop/Presets/Scripts/ 文件夹中,打开 File → Scripts 运行脚本,使用不同的图形,不同的值,会得到非常有趣的结果:

总结
正如你可以从下面的参考资料部分的链接数量看,还有更多要说的,其实脚本无法在一篇文章全部都介绍清楚。但我希望,我的文章能激起了你的兴趣,并说明脚本是如何强大和有用。
如果你决定深入的研究,让我们一起学习和分享,我们学习交流QQ群:99318241,在群里你可以提问和分享资源。
让我们一起使Photoshop更加适用!
资源
我同样也还在学习Photoshop脚本,下面是我学习的所有资料,现在提供给大家一起学习:
QQ截图20131214161522.png
百度网盘下载地址:
http://pan.baidu.com/s/1iWgz8


参与人数 2大洋 +10 收起 理由
zzucloud + 5 赞一个!
6豪 + 5 神马都是浮云

查看全部评分

本帖被以下淘专辑推荐:

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩回复

文明上网理性发言、请文明用语

zero0822 | 设计师 | 发表于 2013-12-14 20:40:24
脚本的功能是强大的,ohyeah
0 回复

举报

guihuashizyl | 设计师 | 发表于 2013-12-15 10:12:22
PS用脚本,这个N啊
0 回复

举报

sxgtoocold | 设计主管 | 发表于 2013-12-15 13:39:12
楼主还共享资料,,,好人啊
0 回复

举报

ddevil | 设计助理 | 发表于 2013-12-16 10:50:04
赞!!!!!!!!!!!
0 回复

举报

马小涛 | 设计助理 | 发表于 2013-12-16 17:19:32
厉害,我学校上次来了个用编程建模的,能做各种复杂模型,这次又是画图的。编程什么都能做,学软件显得好傻(+﹏+)~
0 回复

举报

任何困难都不是 | 实习生 | 发表于 2013-12-16 20:04:22
很强大....
0 回复

举报

panzhongan | 设计助理 | 发表于 2013-12-17 08:03:34
非常强大!!!
0 回复

举报

帝豪 | 实习生 | 发表于 2013-12-17 08:25:48
表示看晕了!
0 回复

举报

gerryellis | 实习生 | 发表于 2013-12-17 09:10:19
[s:189][s:189][s:189][s:189]
0 回复

举报

冰刀雪剑风 | 设计助理 | 发表于 2013-12-17 09:27:43
好厉害
0 回复

举报

推荐学习