誰說設計師不會寫程式碼?—Photoshop指令碼語言簡介

騰訊MXD發表於2013-09-29

自動化對每個設計師的工作來說是很有用的。它可以在重複的任務上節省寶貴的時間,還能夠幫我們更快捷、更容易的解決一系列問題。

你可以使用photoshop的動作來使工作流程自動化,這是很流行的,大多數人都知道並且已經在使用的方法。今天,我們將介紹給你一種高階的自動化技巧:指令碼語言。所有的這一切僅僅需要你有一點點關於JavaScript的基本知識,這對於我們中的一些網頁設計師往往都是具備的。

我很多年前就知道Photoshop的指令碼語言,但是我幾個月前才開始決定研究它。我忽視了它是因為我認為那是聰明的具有數學思維能力的程式設計師的領域。但是我錯了,今天我將要來告訴大家,儘管它需要一些基本的程式技巧,指令碼語言並不是那麼難掌握。

但是,一開始,我們得回答以下這幾個明顯的問題:

為什麼我們需要指令碼語言?

為什麼我們在Photoshop已經有了很棒的動作之後還要需要學習指令碼語言?答案是互動性!當你使用動作時,你不能真正的控制它在不同的情況下的表現,就像錄影帶不停的一遍又一遍的播放而沒有任何改變。

no-2 (1)

一個指令碼語言更靈活,它表現形式的改變取決於你輸入的引數或者是應用程式的內容。聽起來很有用?不是麼?

要求

你不需要是一個會寫指令碼語言的高階的程式設計師。我就僅僅是一個平面設計師,就像你們大多數人一樣。但是你需要對JavaScript至少有一個基本的瞭解,以及一些屬性和方法的經驗去領悟這篇文章的大部分內容。

no-3

如果你對JavaScript一點都不瞭解,別害怕!有很多地方你可以瞭解程式的一些基本知識。例如:Codecademy,有很棒的完整的互動式課程。

我使用CS5,但是這篇文章中講的也同樣適用於新版本。Adobe從CS5開始已經沒有對其指令碼API進行更新。我會選擇看最新的指令碼文件版本,雖然它是cs6的.

開整

當你開始在PS中記錄動作的時候,你設定了一個達到某一結果的步驟順序,這就是你的演算法。然後你按下開始動作,在PS裡面就一個接一個的重複你剛才的動作。指令碼也差不多,但是不會一步一步的在PS中完成,而是你把它們一條一條的寫出來。在PS裡面大多數你想要完成的動作都有相同的功能按鈕可以完成。

no-4

如果你需要創造一個動作將你的檔案從原始大小放大到150%,你需要完成以下幾步:

1,開啟影象-影象大小

2,長寬輸入150%

3,點選確定。

同樣的指令碼語言會是這樣寫:

1,為這個應用命名為:app

2,選中檔案:activeDocument

3,把這個屬性命名為重設影象大小:resizeImage(width,height)

程式碼就是這樣:

語言

有三種方式在PS裡面寫指令碼:在mac上用AppleScript, Windows用VBScript,或者用JavaScript在兩者上都可以。我使用第三種方式,因為它可以跨平臺,並且我有一定JavaScript的基礎。

工具

Adobe有它自己的寫指令碼的工具,叫做:ExtendedScript Toolkit.

no6

這個工具包在PS裡面,你可以在這個資料夾中中找到:

Mac OSX: /Applications/Utilities/Adobe Utilities CS6/ExtendScript ToolkitCS6/

Windows: C:\Program Files\Adobe\Adobe Utilities-CS6\ExtendScriptToolkit CS6(64位的Program Files(x86))

ExtendedScript Toolkit的使用者介面非常的簡單。開始寫程式碼,第一步就是要在下拉選單中選擇目標應用。如果PS已經在執行,就可以看下下拉選單旁邊的綠色連結圖示:

no-7

這個時候,你可以像這樣寫:

按cmd+R(或者直接在工具欄上點選“播放”按鈕)來執行你寫的程式碼。ExtendedScript Toolkit將會轉換到PS裡面然後彈出提示框:

no-9

ExtendedScript Toolkit 有一些其他的除錯程式碼的不錯特性,但是這一段程式碼就這樣就夠了。你可以通過:幫助-JavaScript Tools Guide學到更多如何使用它。

你可以使用任何文字編輯來寫程式碼,只需要儲存為.jsx格式檔案就好了。你必須在PS裡通過File-Scripts-Browse來找到並執行它。 或者是,在PS裡面開啟指令碼檔案。你也可以在指令碼的前面加上一行程式碼,這樣這個程式碼就會常在PS裡面開啟:

直接儲存你的程式碼在 Photoshop/Presets/Scripts/,然後通過File-Scripts訪問它們。你也可以設定一個快捷鍵,前往Edit-Keyboard Shortcuts,連結到 File-Script-[你的程式碼名稱],然後選擇一個你想要設定的快捷鍵。

ExtendedScript Toolkit可以在整合的開發環境下執行和除錯程式碼,同時它還有一個目標模型指示器來安裝,這是很有用的。所以我推薦使用toolkit來寫指令碼。不幸的是,Mac版本的有時候會崩潰,所以要記住這一點。

Photoshop物件模型

為了使指令碼寫起來簡單些,你需要懂得在Photoshop檔案物件模型(DOM)中事件是怎樣互相聯絡的。如果你觀察PS本身,理解起來並不困難。PS的DOM裡面最主要的物件就是應用程式。在應用程式裡面,我們有一個資料夾在PS裡面是當前開啟的。

每一個檔案包含一些元素:例如圖層(被稱為Artlayers),圖層組(layerSets),通道,歷史記錄等等–就像一個普通的PSD檔案。

下面就是一個簡單的視覺化的PS的DOM。更詳細的包含層級的可以在”Adobe Photoshop CS6 Scripting Guide”Pdf檔案中12頁裡找到。

no-11

一個簡單的視覺化的Photoshop DOM

這裡面的每一個目標都有它自己的屬性和方法你可以編輯它。例如,在一個檔案中改變所選圖層的透明度,你就可以前往Application-Document-layer-Opacity然後選擇你的期望值。程式碼就是這樣寫:

你應該可以猜到,activeDocument和activelayer決定了當前選擇的檔案和圖層。

你可以在“Adobe Photoshop CS6 JavaScript Scripting Reference”PDF檔案中找到大部分的目標和它們的屬性和方法的說明,或者在ExtendedScript Toolkit中通過前往help-object Model Viewer.

讓我們來看看在一個真實的例子中是如何執行的。在接下來的段落中,我們將會基於一個動作寫一段我們自己的程式碼。

用程式碼來重現自我旋轉動作

幾年前的聖誕節,我有一個想法就是用動作幫助我畫一個雪花。

畫雪花

1,首先畫一支雪花的圖案。

no-13

2,複製這一支,同時旋轉一定的角度。

no14

3,重複第二步直到一個完整的圓。

no-15

手動去複製和旋轉每一個元素非常麻煩,所以我想出了一個自動的動作(an action to automate it)去完成它。演算法是這樣的:

1,複製元素。

2,使用變化工具按照你所選擇的角度去旋轉這個元素。

3,複製圖層。

4,使用“重複變換”功能。

5,重複動作4和5直到一個完整的圓。

非常不錯!但是這個動作有一個缺點:根據你在第三步設定的角度數值的演算法,你只能設定一定數量的雪花的分支。

回到當我還不是很熟悉指令碼的時候,我做了幾個版本的動作,每一種產生的雪花都是不同的分支數。

今天,我們將用你輸入分支的數值的動態指令碼來重繪這個動作,讓我們開始吧。

演算法

當你開始寫指令碼的時候,在挖掘程式碼本身之前先設定演算法是個不錯的主意。在我們的情況下,演算法將會是這樣的:

1,詢問使用者輸入分支的數目。

2,計算旋轉的角度。

3,通過第一步設定的數目來複制並旋轉圖層。

首先讓我們從把當前或選定的圖層作為變數儲存起來,為了將來使用:

 

在JavaScript 中注意,你可以標記兩條雙斜線(//)做註解。註解被用來為未來相關部分的程式碼做解釋但是不影響指令碼的執行。

現在讓我們回到我們的演算法上。

1,要求使用者輸入

我們通過prompt(message,defaultvalue[,tittle])這個功能來獲取使用者的輸入資訊:。這個功能表明一個有著”message”對話方塊和一個包含這”fefault value”的輸入框。當使用者點選“確定”,這個給你功能就回到輸入值;因此,我們需要儲存它為一個可是用的變數。

注意我使用了“orginalStem.name”在這段資訊裡面。所以對話方塊會現實所選擇圖層的名稱。

在Mac OS X中,在資訊中的第一行是寬的,作用是標題。因此,我們主要的資訊應該在第二行。另起一行,輸入“\n”.

在Windows中,你可以在功能中指定第三種引數來設定一個標題:

如果我們在PS中執行這個程式碼,將會看到這樣一個對話方塊:

no-19

當使用者點選“確定”,輸入值將會儲存到stemsAmount變數中。如果用去點選“取消”,這個功能將會返回一個無效值。這個我們後面要使用到。

2,計算旋轉的角度

為了計算旋轉的角度,我們需要通過分支的數目來分360度(一個整圓):

3,複製和旋轉

現在我們已經有了我們需要複製的分支的一切。為了這樣去做,我們將使用“for”迴圈。它可以讓我們按照我們想要的次數來反覆的執行一段程式碼。我們的迴圈將會是這樣的:

注意第一個在程式中的物件例子已經有了值為0,但是因為我們第一個圖層已經在畫布上了,我們從1開始這個迴圈。

為了輔助和旋轉我們的圖層,我們將會使用:duplicate()和rotate(angle,AnchorPosition)函式:在angle裡面被旋轉圖層的數目通過複製的指數相乘而得。 Anchorposition決定了哪個圖層將會旋轉的點。當你在PS中使用旋轉工具的時候你可以看到這個點—它看起來是一個小小的加了十字的圓圈。在指令碼中,它僅有9個指定的值-i.e.9個位置的錨點:

no-22

在我們這個情況下,它是這個圖層按鈕的中心。BOTTOMCENTER. PS在這裡或那裡的一些功能上使用了很多其他的一些常量,你可以在”Adobe Photoshop CS6JavaScript Reference”PDF檔案中的197頁找到。因此我們的迴圈就是這個樣子:

完整的程式碼就是下面這個樣子,你可以試著執行:

最後的潤色

我通常會試著使用指令碼來完成我的主要目的。當一切都正確的執行起來的時候,我將會開始優化程式碼。在我們這種情況下,我們需要確保使用者在提示框中輸入一個有效的數值—i.e.一個正整數,而且要大於1。

當然,為了不讓PS瘋掉,我們會限制分支的書目,我們規定,小於100.為了這麼做, 當他們提交了一個無效的數值的時候 ,我們需要使用一個“while”迴圈來告訴使用者一個錯誤的資訊。而且這個提示框將會一直存在,直到使用者輸入一個有效值或者點選“取消”按鈕。(記住如果使用者點選取消將會提示無效值)。

新的程式碼將會是這樣的:

你可能注意到:我們使用了“isNaN(value)”這個功能,它返回 “true”如果 “value”不是一個數字,同時當我們計算旋轉的角度的時候,“parseInt(value)”把“value”轉換成一個整數。

接下來我們要做的事情是管理圖層,通過為它們增加一個索引來重新命名我們的圖層。同事也要確保我們不會把檔案的圖層搞亂,讓我們把我們的分支編組。

為圖層重新命名不是一個很難的事情。我們只需要使用圖層的“name”屬性,然後為它們增加一個索引數字:

PS應用程式介面裡的編組被稱為“LayerSet”,我們通過“layerSets”屬性可以進入檔案的所有編組。為了給檔案增加一個新的組,我們需要稱“layerSet”方法為“add()”:

然後,為了把一個圖層增加到組裡面,我們會使用“move(relativeobject,ElementPlacement)”函式。請注意,“move()”函式只是把圖層移動到圖層堆,而不是移動到畫布上。(你可以用“trabslate(deltaX[,deltaY])”函式把圖層移動到畫布上)

ElementPlacement是另外一個常量,這個常量決定我們怎樣把的圖層跟 relativeobject 關聯在一起。在我們的案例裡,我們使用ElementPlacement.INSIDE 把一個普通圖層放進一個組裡面:

我們使用 ElementPlacement.PLACEATEND.把每一個拷貝的新圖層放在所有圖層租的底部。結果就是我們的所有圖層都是以上升的順序排列,第一個圖層在頂部,最後一個圖層在底部:

你可以在”Adobe Photoshop CS6 Scripting Guide”Pdf檔案中202頁裡

找到更多關於“ElementPlacement”的內容。

最終程式碼

就是它,RotateMe.jsx搞定! 我們最終的程式碼就是這樣:

沒那麼難,哈?

no-32

現在,你可以把這個儲存在photoshop/presets/Scripts/資料夾裡面,然後前

往File-Script執行。使用不同的形狀和不同的賦值可以產生有趣的結果:

no-33

總結

你可以從在後面的資源包裡面連結序號看到,除了文章中介紹的之外還有很多想要講的。但是我希望我們今天所講的能夠激發你的興趣,向你展示了指令碼的作用和巨大潛力。

no-34

如果你想下水試試,讓我們一起來學習和交流經驗吧。你在後面的評論中提出問題或者分享你所做的。如果你不是一個程式設計師,可以考慮留下一個關於指令碼編寫的好主意吧!或許其他的讀者會實現它。讓我們一起來使PS更加有用吧!

資源

1,Adobe Photoshop Scripting ,Adobe Developer Connection

所有的指令碼檔案和實用功能

2,Adobe Introduction to Scripting ,(PDF),Adobe

這個是一些Adobe應用程式的基本程式碼。不錯的是PS的指令碼可以適用於所有的其他Adobe產品,你只需要學習應用的DOM,你就可以上路了。

3,Adobe Photoshop CS6 Scripting Guide ,Adobe

在這個PS指令碼介紹指南里面,你可以學到寫指令碼的基本知識。

4, Adobe Photoshop JavaScript Reference ,(PDF),Adobe

這個檔案描述了你可以在PS裡面用到的所有的物件和他們的函式以及方法。這也是我在寫指令碼的時候用的最多的檔案。

5, JavaScript, Mozilla Developer Network

這裡面有關於一般的JavaScript函式和用法的各種問題的答案。

6,JavaScript Tools Guide, PDF,Adobe

這裡面有一些關於“ExtendedScript Toolkit”的基本資訊,和一些高階技

巧。例如檔案系統的存取,ScriptUI, XML的使用,sockets等等。

7,PS-Script

一個獨立的關於PS指令碼的論壇。我不能註冊參與討論(因為某些未適應系統),但是它有很多可以被發現的解決問題的答案。

8, Photoshop Scripting,Adobe Community

Adobe的PS指令碼官方論壇,有一些很好的在使用者使用的過程中遇到的問題的討論。

相關文章