脚本可以成为你的助手。但脚本不仅可以完成动作或宏的功能,还允许你在一个脚本中操作多个文档和多个应用程序。
如果你使用MacOS系统:
AppleScript
JavaScript
如果你使用Windows系统:
VBScript(Visual Basic和VBA也可用)
JavaScript
JavaScript相对于AppleScript和VisualBasic有一些小优势:
你的脚本可以在Windows或MacOS中使用。如果有可能你想要在两个平台上分享或使用你的脚本,你应该学会使用JavaScript。
在Photoshop中,你只能从应用程序内访问.jsx 文件。
脚本基础
1,脚本的构建块
在脚本编写中,名词被称为对象,而动词被称为命令(在AS中)。
使用属性修改脚本对象。要修改命令或方法,使用参数。
2,理解对象、属性、方法和命令
文档内创建或操作图层、文本、框架、通道、图形线、颜色和其他设计元素。这些东西都是对象。
要创建脚本语句,创建一个对象或引用一个现有对象,然后执行以下操作之一:
为对象的属性定义值。例如,可以指定文档的名称、高度或宽度。可以指定图层的名称、颜色或不透明度。
指定命令或方法,告诉脚本对的对象执行什么操作。例如,可以打开、关闭、保存和打印文档。可以合并、移动或光栅化图层。
在编写脚本时要记住的一点是,只能使用对象允许的属性或方法/命令。要知道哪些属性和方法适用于哪个对象,怎么办?在很大程度上,这是合乎逻辑的。通常,如果可以在Adobe应用程序中指定某些内容,就可以在脚本中指定它。
3,使用对象
在脚本中使用对象的主要概念是如何引用一个对象。如何让应用程序知道的脚本要更改哪个对象?在应用程序的用户界面中,可以通过单击对象来简单选择它。但在脚本中,情况会稍微复杂一些。
DOM概念
DOM的原则是包含层次结构。
注意:对象的包含对象也被称为其父对象。
因此,按照DOM原则,如何在文档中添加一个图层?(在JS中图层称为artLayers)。
app.documents.layers.add();
本指南介绍了三种引用对象的方法:
- 变量
- 集合或元素编号
- “当前”对象或“活动”对象属性
(1)变量
创建了一个名为myDoc的变量来包含文档。
var myDoc = app.documents.add();
创建另一个变量来保存图层。
var myDoc = app.documents.add();
var myLayer = myDoc.layers.add();
保存对象的变量还保存了标识该对象的整个包含层次结构。
变量命名
所有变量名称必须符合以下规则:
(2)在JS中,第一个文档是documents[0](请注意方括号中的索引),因为(一开始很难记住)JavaScript从0开始对集合对象编号。
通过索引引用文档和图层对象,以添加新的对象。
注意:因为以下脚本不使用变量,所以在每个对象引用中都需要整个包含层次结构。app.documents.add();
app.documents[0].layers.add();
app.documents[0].layers[0].textFrames.add();
元素和集合如何为后续项编号
以下是脚本语言处理将第二个对象添加到集合或元素时的自动编号方式:
JS集合编号是静态的;添加的第一个对象被分配编号0,添加到集合的下一个对象是编号1;如果添加第三个对象,则其编号为2。指代当前或活动对象
方便的是,许多父对象包含属性,允许轻松地引用活动对象。
(3)在JS中,属性名称是一个合成词,结合了"active"和对象名称,在标准JS用例中:
- 组合术语中的第一个单词为小写。
- 组合术语中的第二个单词(以及所有后续单词)使用首字母大写。一些示例包括:
activeDocument(活动文档)
activeLayer(活动图层)
activeChannel(活动通道)
activeView(活动视图)
app.documents.add();
app.activeDocument.layers.add();
使用属性
要定义或修改对象的属性,需要执行以下三个步骤:
1. 命名对象。
2. 命名属性。
3. 指定属性的值。
(1)值可以是以下任何数据类型:
字符串,是被解释为文本的字母数字文本。用引号("")括起字符串。字符串包括对象的名称等值。
数值,是可用于数学运算(如加法或除法)的数字值。数学数字包括帧一侧的长度或段落之间的间距、不透明度百分比、字体大小、描边权重等。
变量。当将变量用作属性值时,不需要像字符串那样将变量括在引号中。
布尔值,即true或false。
常量值(也称为枚举),是一组预定义的可选择值。
列表(AS)或数组(JS和VBS)。
一些属性需要多个值,例如点位置的页面坐标(x和y坐标),或文本框或几何对象的边界。单个属性的多个值在AS中称为列表,在JS或VBS中称为数组。每种语言都指定了格式规则。
列表或数组必须被括起,在JS中,数组用方括号括起:[]
值之间用逗号(,)分隔。可以在逗号后包含或省略空格;这没有关系。
JS(3,4,5)或["string1","string2", "string3"]
列表或数组可以包含嵌套的列表或数组,例如页面坐标的列表。在以下示例中,请注意每个嵌套数组都是单独括起的,并且嵌套数组之间用逗号分隔。
JS[[x1,y1], [x2, y2], [x3, y3]]
可以使用properties属性在单个语句中设置多个属性。将多个属性格式化为一个由大括号括起的数组,在数组中,使用冒号(:)分隔每个属性名称/属性值对。以下脚本使用properties定义了图层的名称和可见性状态。
var myDoc = app.documents.add();
var myLayer = myDoc.layers.add();
myLayer.properties = {name: "My NewLayer", visible: false};
(2)在JS中使用属性,命名要定义或修改属性的对象,插入一个句点(.),然后命名属性。为指定值,请在属性名称后放置等号(=),然后输入值。
var myDoc = app.documents.add();
var myLayer = myDoc.layers.add();
myLayer.name = "My New Layer";
要定义多个属性,可以编写多个语句:
var myDoc = app.documents.add();
var myLayer = myDoc.layers.add();
myLayer.name = "My New Layer";
myLayer.visible = false;
JS还提供了一种定义多个属性的简写,称为with语句。
var myDoc = app.documents.add();
var myLayer = myDoc.layers.add();
with(myLayer){
name = "My New Layer";
visible = false;
}
理解只读和可读写属性
在定义属性值时,可以编写具有完美语法的脚本语句,但该语句不会产生任何结果。
使用警报框显示属性的值
在JS中显示警报框,使用alert() 方法,通过键入alert,然后在括号中键入对话框内容。不要在alert 和第一个括号之间键入空格。要查找集合中有多少个对象,使用任何集合对象的(只读)length属性。
以下脚本显示一个警报框,告诉文档集合中有多少个文档,然后添加一个文档,并显示一个更新后的数字的新警报。
注意:集合对象名称是对象的复数形式。例如,文档对象的集合对象是documents 对象。
alert(app.documents.length);
var myDoc = app.documents.add();
alert(app.documents.length);
以下脚本在警报框中显示文档的名称。
var myDoc = app.documents.add();
alert(myDoc.name);
(3)常量值和枚举
一些属性的值由应用程序预定义。
在脚本编写中,这些预定义值被称为常量或枚举。
使用常量或枚举类似于在应用程序用户界面中使用下拉列表。
注意:要查找是否必须使用枚举作为属性值,
在JavaScript中,键入枚举名称,一个句点(.),然后是枚举值。
- 在Photoshop中:
- 每个枚举都以大写字母开头,组合术语中的所有单词也以大写字母开头。
- 枚举值全部大写。
下面的示例使用LayerKind枚举使图层成为文本图层。
var myDoc = app.documents.add();
var myLayer = myDoc.artLayers.add();
myLayer.kind = LayerKind.TEXT;
使用变量存储属性值
以下脚本创建变量来存储文档宽度和高度的值,然后将这些变量用作更改宽度和高度的语句中的值。
var myDoc = app.documents.add(7, 10);
var docHeight = myDoc.height;
var docWidth = myDoc.width;
myDoc.resizeCanvas((docHeight - 2), (docWidth -2));
使用方法或命令
将方法插入到JS语句的末尾。在方法名之前必须放置一个句点,并在方法名之后加上括号(())。
app.activeDocument.print();
命令或方法参数
一些命令或方法需要额外的数据,称为参数。命令或方法也可以有可选参数。
必需参数
以下脚本使用合并命令,该命令需要指示要合并到选定图层的图层的某些指示。与属性一样,命令参数用花括号({})括起来。然而,在花括号内,只包括参数值,而不是参数名称。
方法参数包含在跟在方法名后的括号中。
var myDoc = app.documents.add();
var myLayer = myDoc.layers.add();
var myLayer2 = myDoc.layers.add();
myLayer2.merge(myLayer);
多个参数
在为命令或方法定义多个参数时,必须遵循特定规则。
在JS中,必须按照脚本参考资源中列出的顺序输入参数值,以便脚本编译器知道哪个值定义了哪个参数。
要跳过可选参数,请键入占位符undefined。以下语句创建一个宽度为4000像素,高度为5000像素,分辨率为72,名称为"MyDocument",文档模式为位图。
app.documents.add(4000, 5000, 72, "MyDocument", NewDocumentMode.BITMAP)
下一条语句创建一个相同的文档,只是将分辨率留空未定义。
app.documents.add(4000, 5000, undefined, "MyDocument", NewDocumentMode.BITMAP)
注意:仅使用undefined占位符来"触及"想定义的参数。以下语句仅定义文档的高度和宽度;不需要为后续可选参数使用占位符。
app.documents.add(4000, 5000)
改变变量的值
在JavaScript中更改变量的值,使用变量名称后跟等号(=)和新值。
不要以var开始重新分配语句;只有在创建新变量时才使用var。
var docRef = app.documents.add();
var layerRef = myDoc.layers.add();
layerRef.name = "First Layer";
layerRef = myDoc.layers.add();
layerRef.name = "Second Layer";
使用变量引用现有对象
还可以创建变量来包含现有对象。
var myDoc = app.activeDocument;
使脚本文件更易读
这一部分涵盖了两个选项,有助于使的脚本文件更易读:
1,注释
2,换行
(1)在JavaScript中:
//这是单行注释
app.activeDocument.print(); //这行的一部分也是注释
/*这是一个多行注释,无论它包含多少行,都完全被脚本引擎忽略。
不要忘记关闭星号和斜杠,否则你的整个脚本都会被注释掉...*/
(2)注意:在JavaScript中,语句可以包含回车,因此不需要延续字符。然而,ExtendScript解释器将每一行解释为一个完整的语句。因此,最好只在语句的结尾插入回车。
使用数组
在VBScript和JavaScript中,数组类似于集合;但是,与集合不同,数组不会自动创建。
可以将数组视为单个变量的值列表。例如,以下JavaScript数组为变量myFiles列出了四个值:
var myFiles = new Array();
myFiles[0] = "clouds.bmp";
myFiles[1] = "clouds.gif";
注意,每个值都有编号。要在语句中使用值,必须包括该编号。以下语句打开了文件
open(myFiles[1]);
到此为止,已经掌握了创建执行基本任务的简单脚本所需的知识。
1,JavaScript对象模型查看器
属性名称后跟数据类型。
常量名称以与Adobe应用程序的缩写名称匹配的前缀开头。例如:
在PhotoshopCS6中,枚举使用Ps前缀。示例:PsColorProfileType,PsBitsPerChannelType
如果数据类型是对象,则对象名称是指向对象类型的超链接。
仅当属性是只读时,访问值才会出现。如果属性是可读写的,则不会显示访问值。
属性描述显示在信息窗格底部。
2,了解方法列表
当在“成员”窗格中选择方法时,方法的信息将按以下方式显示在对象浏览器窗口底部的信息窗格中:
每个参数名称后跟数据类型。
方法名称后跟参数。可选参数用方括号括起来([])。
如果参数名称周围没有括号,则该参数是必需的。
如果数据类型是对象,则数据类型是指向对象的超链接。
如果数据类型是枚举,则枚举名称以应用程序的首字母开头,并且是指向枚举信息的超链接。
如果参数存在默认值,则该值将在等号(=)后的数据类型之后列出。
注意:只有可选参数具有默认值,如果没有为参数定义值,则将使用默认值。
以下是Photoshop中图层对象的示例属性表,其中包含了各种数据类型的示例。
属性 描述
Bounds 只读。描述图层边界矩形的坐标数组格式为[yl,xl, y2, x2]。
Kind 只读。图层的类型。
Name 可读写。图层的名称。
Opacity 可读写。不透明度,以百分比表示。(范围:0.0 到 100.0)
TextItem 只读。与图层关联的文本项。注意:仅在kind= LayerKind时有效。TEXT。参见kind。
Visible 可读写。如果为true,则图层可见。
3,操作对象的方法表
对象的方法表列出了以下信息:
1,可以与对象一起使用的方法
2,每个方法的参数
当参数类型是常量或另一个对象时,该值以超链接形式呈现,指向常量或对象的清单。在下面的方法表示例中,参数类型NewDocumentMode和DocumentFill是常量。
参数可以是必需的或可选的。可选参数由方括号([])表示。
返回值类型,即方法生成的内容
当返回值是常量或另一个对象时,该值以超链接形式呈现,指向常量或对象的清单。在下面的方法表示例中,返回值Document是一个对象。
3,描述,定义方法的功能
以下是PhotoshopCS6文档的add方法的参数的示例方法表。
所有参数都是可选的,由方括号表示。
宽度和高度参数默认为当前标尺单位,因此数据类型是list:asunitvalue. 换句话说,如果当前垂直标尺单位是英寸,水平标尺单位是厘米,以下语句将创建一个宽度为5英寸、高度为7厘米的文档:
JavaScript: `app.documents.add(5, 7)`
mode和initialFill采用常量值。
以下脚本语句为示例方法表中列出的每个参数定义了值。
app.documents.add(5, 7, 72, "Diary",NewDocumentMode.BITMAP, DocumentFill.TRANSPARENT, 4.7)
高级脚本技术
大多数脚本并不按顺序从头到尾执行。通常,脚本根据从当前文档中获取的数据采取不同的路径,或者多次重复执行命令。控制结构是脚本语言的特性,使的脚本能够执行这样的操作。
条件语句
if语句
以下每个脚本都会打开一个文档,然后检查文档是否只包含一个图层。如果只有一个图层存在,脚本会添加一个图层,并将新图层的填充不透明度设置为65%。
JavaScript(JS):在JS中,if语句以关键词if开头,后跟括号中的比较短语。将if语句中的操作用花括号{}括起来。
var myDoc = app.open(File("/c/ProgramFiles/Adobe/Adobe Photoshop CS6/Samples/Ducky.tif"));
if (myDoc.artLayers.length == 1) {
var myLayer = myDoc.artLayers.add();
myLayer.fillOpacity = 65;
}
注意:JavaScript使用双等号(==)进行值比较,与用于分配值给属性或变量的单等号(=)不同。
现在关闭Ducky.tif,然后尝试使用以下if语句运行脚本:
if(myDoc.artLayers.length < 1) {}
有时,可能会有一个稍微复杂的要求,例如:“如果文档只有一个图层,将图层的填充不透明度设置为50%——但如果文档有两个或更多图层,将活动图层的填充不透明度设置为65%。”这种情况需要使用ifelse语句。
javascript
var myDoc = app.open(File("/c/ProgramFiles/Adobe/Adobe Photoshop CS6/Samples/Ducky.tif"));
if (myDoc.artLayers.length < 2) {
myDoc.activeLayer.fillOpacity = 50;
} else {
myDoc.activeLayer.fillOpacity = 65;
}
循环
JavaScript(JS):
javascript
var myDoc = app.activeDocument;
var myLayerCount = myDoc.layers.length;
for (var myCounter = 0; myCounter
var myLayer = myDoc.layers[myCounter];
myLayer.visible = true;
}
此脚本使用for循环,这是JavaScript中最常见的技术之一。与上面的AppleScript一样,脚本使用两个变量myLayerCount和myCounter,标识一个图层,然后递增图层编号,直到文档中的所有图层都被标识。递增发生在for语句中的第三条语句中:myCounter++。++语法将1添加到当前值,但直到循环的操作完成之前不会添加1。
领取专属 10元无门槛券
私享最新 技术干货