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有以下優點:

  1. JavaScript通用Windows與Mac系統。(針對Photoshop而言)
  2. JS的使用人數相當龐大,網路資源相當豐富。
  3. 腳本式語言,不僅撰寫方便(如果沒有工具的話記事本就可以編輯),學習的痛苦度也會比較低。

由於我沒接觸過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 

Tagged : , , , , , ,

你可能會感興趣

“天啊!我的Photoshop變聰明了 – 利用指令碼進階自動化入門” 目前共有 3 則迴響

  1. Photoshop 進階使用法,這真的是太厲害了!

    感謝教學的分享,先收藏起來:)

  2. 謝謝分享!!!

  3. 精彩!
    最近正在研究怎樣把RAW檔加框並把EXIF寫出來
    看到樓主的好文~
    受教了

留下迴響





*