Photoshop提供「動作(action)」來加快工作效率,但是動作實質上只是一種「巨集(Macro)」,遇到較為特殊的狀況就顯得力不從心了,但是不要緊!因為Photoshop還提供另一種更強大的功能「指令碼(Scripting)」,可以讓使用者有彈性的達成更複雜的自動化動作。
Photoshop Scripting支援多種程式語言操控Photoshop執行及判斷各式各樣的動作,印象中如果沒記錯的話是從7版開始支援的,目前CS3版支援的腳本語言(Script language)如下:
- AppleScript (Mac系統適用)
- VBScript (Windows系統適用)
- JavaScript (Windows與Mac系統皆適用)
另外除了可以利用腳本語言撰寫指令碼,Photoshop也提供以ActiveX的方式,讓使用編譯式語言的使用者也能夠輕易操縱Photoshop。
記得我第一次發現Photoshop Scripting這玩意時,真是驚為天人,直呼「這真是太神奇了」,但是一直到現在好像鮮少人提及、談論這東西,它到目前始終算是蠻冷門的東西,或許是因為美術設計人員沒心思研究這個看似複雜難用的功能吧。
如何執行指令碼
1.從Photoshop中開啟:
在功能表的「檔案 >> 指令碼」中內建許多實用的功能,若使用者自行撰寫指令碼,可以使用「瀏覽」開啟自訂的指令碼。
2.將指令變成Photoshop功能表的一部分:
將指令碼檔案放到「Photoshop安裝目錄\預設集\指令碼\」中,再次開啟Photoshop就會顯示在「檔案 >> 指令碼」的子選單中了。
註:CS3版本必須為*.jsx的JavaScript檔案
3.直接執行:
可以直接點兩下自訂的指令碼檔案,讓系統自動以預設的程式開啟指令碼檔案,如果你的指令碼是*.vbs的VBScript檔案或*.js的JavaScript檔案,通常系統預設開啟的程式為「Microsoft (r) Windows Based Script Host」,但是如果安裝了某些編輯器,可能會被更改為由該編輯器開啟,此時可以將vbs檔案設定成「系統目錄\system32\wscript.exe」執行。
在CS3版本中可以將JavaScript存成,*.jsx,則預設會由Photoshop所提供的「ExtendScript Toolkit 2 and Debugger」執行。
Photoshop Scripting基礎
對於想學習Photoshop Scripting(以下簡稱PSS)卻尚未學習過任何程式語言的人,建議學習JavaScript,因為JavaScript有以下優點:
- JavaScript通用Windows與Mac系統。(針對Photoshop而言)
- JS的使用人數相當龐大,網路資源相當豐富。
- 腳本式語言,不僅撰寫方便(如果沒有工具的話記事本就可以編輯),學習的痛苦度也會比較低。
由於我沒接觸過AppleScript,所以只簡單談談VBScript(以下簡稱VBS)及JavaScript(以下簡稱JS)的小小心得,以及兩者之間的差異,有興趣的人可以參閱「Photoshop安裝目錄\指令碼手冊\」,裡面包含詳細的說明文件及範例檔。
備註:編譯式語言如果要使用ActiveX控制Photoshop,建議參閱Photoshop VBScript參考文件。
以下程式碼JS存成*.js或CS3版的*.jsx,VBS存成*.vbs
建立及使用PSS物件
Application物件,代表整個Phoshop應用程式
JS,使用#target photoshop宣告,之後就能直接操作PSS所提供的各種物件
#target photoshop //使用Application物件將Photoshop推到最上層 app.bringToFront();
VBS,利用CreateObject建立Photoshop所提供的ActiveX物件
Dim app Set app = CreateObject( "Photoshop.Application" ) '使用Application物件將Photoshop推到最上層 app.bringToFront
Application.Documents物件
Doucments是Document的集合,簡單一點說,Documents就是指目前所有開啟的圖檔,例如:可以利用Doucments來判斷目前Photoshop開啟幾個圖檔
JS,使用length屬性得知目前開啟圖檔數量
#target photoshop
alert("目前開啟圖檔數量:" + app.documents.length);
VBS,與JS不同,必須使用count屬性得知目前開啟圖檔數量
Dim app
Set app = CreateObject( "Photoshop.Application" )
MsgBox("目前開啟的圖檔數量:" & app.documents.count)
Document物件
既然Documents物件是指目前所有開啟的圖檔,那麼Document(沒有複數s),就是指目前所開啟的某個圖檔,例如:可以利用activeDocument,取得目前正在使用的圖檔尺寸。
JS
#target photoshop
//判斷是否有開啟圖檔
if(app.documents.length > 0)
{
//有開啟圖檔,設定doc為目前圖檔的參照(reference)
var doc = app.activeDocument;
//顯示目前圖檔尺寸
alert("目前圖檔尺寸為\n寬:" + doc.width + "\n高:" + doc.height);
//顯示第一個圖檔文件的尺寸
doc = app.documents[0];//圖檔依照順序從0開始
alert("第一個圖檔尺寸為\n寬:" + doc.width + "\n高:" + doc.height);
}
VBS
Dim app
Dim doc
Set app = CreateObject( "Photoshop.Application" )
'判斷是否有開啟圖檔
If app.documents.count > 0 Then
Set doc = app.activeDocument
MsgBox("目前圖檔尺寸為" & vbcr & _
"寬:" & doc.width& vbcr & "高:" & doc.height)
Set doc = app.Documents.item(1)'//圖檔依照順序從1開始
MsgBox("第一個圖檔尺寸為" & vbcr & _
"寬:" & doc.width& vbcr & "高:" & doc.height)
End If
SolidColor物件
SolidColor也就是顏色,在PSS中所有跟顏色扯上關係的都要使用SolidColor,例如:設定Photoshop的前景色
JS,用new建立SolidColor物件
#target photoshop var myColor = new SolidColor(); //設定SolidColor的RGB屬性,將顏色設成青色 myColor.rgb.red = 0; myColor.rgb.green = 255; myColor.rgb.blue = 255; //將Photoshop的前景色設置為青色 app.foregroundColor = myColor;
VBS,一樣使用CreateObject建立SolidColor物件
Dim app Set app = CreateObject( "Photoshop.Application" ) '設定SolidColor的RGB屬性,將顏色設成青色 Set myColor = CreateObject( "Photoshop.SolidColor" ) mycolor.rgb.red = 0 mycolor.rgb.green = 255 mycolor.rgb.blue = 255 '將Photoshop的前景色設置為青色 app.foregroundColor = myColor
又或者,可使用更簡單的方式來設定前景色
JS
#target photoshop //直接設定foregroundColor,將前景色設成青色 app.foregroundColor.rgb.red = 0; app.foregroundColor.rgb.green = 255; app.foregroundColor.rgb.blue = 255;
VBS
Dim app Set app = CreateObject( "Photoshop.Application" ) '直接設定foregroundColor,將前景色設成青色 app.foregroundColor.rgb.red = 0 app.foregroundColor.rgb.green = 255 app.foregroundColor.rgb.blue = 255
簡單的縮圖範例
來一個簡單的範例, 要做縮圖的時候,如果單純使用動作(Action),並無法自動根據圖檔是寬的還是高的進行不同的縮圖處理,這時指令碼就派上用場啦
JS
#target photoshop
//-----設定-----------------------
var limitWidth = 200;//最大寬度
var limitHeight = 160;//最大高度
var ImgResolution = 72;//解析度
//--------------------------------
//把Photoshop推到最上層
app.bringToFront();
//設定使用的單位為「像素(Pixel)」
app.preferences.rulerUnits = Units.PIXELS;
//呼叫要處理縮圖的函數
ReSizeImg();
function ReSizeImg()
{
//判斷是否有開啟圖檔
if(app.documents.length > 0){
//有開啟圖檔,設定doc為目前圖檔的參照(reference)
var doc = app.activeDocument;
}else{
//沒有開啟圖檔
alert("請開啟要調整大小的圖檔");
return;
}
//如果原圖小於或等於縮圖尺寸,則跳出不處理
if(doc.width <= limitWidth && doc.height <= limitHeight)return;
//開始判斷縮圖大小
var rsWidth = doc.width;
var rsHeight = doc.height;
var Scale = 1.0;
if(doc.width > limitWidth){
Scale = limitWidth / (doc.width + 0.0);
rsWidth = doc.width * Scale;
rsHeight = doc.height * Scale;
}
if (rsHeight > limitHeight){
Scale = limitHeight / (doc.height + 0.0);
rsWidth = doc.width * Scale;
rsHeight = doc.height * Scale;
}
//執行更改圖像大小指令
doc.resizeImage(rsWidth, rsHeight, ImgResolution, ResampleMethod.BILINEAR);
}
不厭其煩的,也來個VBS版,請注意與JS不同的地方
Dim app
Dim doc
Dim limitWidth
Dim limitHeight
Dim ImgResolution
Dim rsWidth
Dim rsHeight
Dim Scale
Set app = CreateObject( "Photoshop.Application" )
'-----設定-----------------------
limitWidth = 200 '最大寬度
limitHeight = 160 '最大高度
ImgResolution = 72 '解析度
'--------------------------------
'把Photoshop推到最上層
app.bringToFront()
'設定使用的單位為「像素(Pixel)」,跟JS不太一樣哦
app.preferences.rulerUnits = 1 ' psPixels
'呼叫要處理縮圖的函數
ReSizeImg()
Function ReSizeImg()
'判斷是否有開啟圖檔
If app.documents.count > 0 Then
'有開啟圖檔,設定doc為目前圖檔的參照(reference)
Set doc = app.activeDocument
Else
'沒有開啟圖檔
MsgBox("請開啟要調整大小的圖檔")
Exit Function
End If
'如果原圖小於或等於縮圖尺寸,則跳出不處理
If doc.width <= limitWidth And doc.height <= limitHeight Then Exit Function
'開始判斷縮圖大小
rsWidth = doc.width
rsHeight = doc.height
Scale = 1.0
if doc.width > limitWidth Then
Scale = limitWidth / (doc.width + 0.0)
rsWidth = doc.width * Scale
rsHeight = doc.height * Scale
End If
if rsHeight > limitHeight Then
Scale = limitHeight / (doc.height + 0.0)
rsWidth = doc.width * Scale
rsHeight = doc.height * Scale
End If
'執行更改圖像大小指令,跟JS不太一樣哦
doc.resizeImage rsWidth, rsHeight, ImgResolution, 3
End Function






七月 21, 2008 at 3:45 上午
Photoshop 進階使用法,這真的是太厲害了!
感謝教學的分享,先收藏起來:)
七月 10, 2010 at 6:00 下午
謝謝分享!!!