PS高端教程:在PS中用腳本語(yǔ)言來(lái)處理圖片

譯者@Gaoyoungor 的話:原文作者Ross Aitken(個(gè)人教程站:http://psdlearning.com/)這篇文章寫(xiě)得很詳細(xì),力圖讓每一個(gè)讀者都能看懂。本文主要涉及到三塊主要技術(shù):調(diào)色、添加邊框和陰影以及隨機(jī)旋轉(zhuǎn)。調(diào)色的方法是復(fù)制圖片圖層,然后平均模糊取得該圖片的平均色,其后用圖片RGB通道直方圖校驗(yàn)的方法取得該平均色的色值,并根據(jù)各通道顏色比例作出調(diào)整,然后用所得的顏色填充復(fù)制的圖片層,其后反相,更改混合模式為顏色,降低不透明度,從而形成影樓級(jí)調(diào)色效果;添加陰影和邊框則主要涉及到畫(huà)布大小的重定和高斯模糊濾鏡。圖片的隨機(jī)旋轉(zhuǎn)則涉及到Math.random(),創(chuàng)建一種隨機(jī)的效果。教程最終實(shí)現(xiàn)的效果很簡(jiǎn)單,但通篇教程旨在滲透原理和思想,拋磚引玉,相信聰明的你能發(fā)揮才思完成驚人的作品!感謝Black_Ray大神的貼身技術(shù)指導(dǎo),沒(méi)有他的幫助這篇文章會(huì)夭折。大家可以查看jsx源文件每一步我都有注明過(guò)程及作用,想要學(xué)習(xí)更多的朋友可以下載ps官方的api文檔閱讀。

jsx源文件共享:http://vdisk.weibo.com/s/JjyMe
官方api文檔Photoshop_CS5_Scripting_Guide: http://vdisk.weibo.com/s/JjyTk

原文標(biāo)題:Manipulate an Image with Scripting
原文地址:photoshoptutorials
優(yōu)設(shè)網(wǎng) SDC翻茄匠:@Gaoyoungor

正文:

PS中用腳本語(yǔ)言來(lái)處理圖片

PS高端教程:在PS中用腳本語(yǔ)言來(lái)處理圖片

腳本控制在常規(guī)的ps教程中是很少涉及到的東西,但絕對(duì)是值得學(xué)習(xí)的技巧。腳本在自動(dòng)化任務(wù)流程控制方面相對(duì)于ps action(動(dòng)作)來(lái)說(shuō)更為強(qiáng)大,而且能完成一些利用photoshop常規(guī)軟件技巧不能實(shí)現(xiàn)的任務(wù)。下面我們來(lái)創(chuàng)建一個(gè)腳本來(lái)編輯照片,讓你的圖片以一種更為時(shí)髦的方式去展示。

介紹

在這篇教程中,我旨在介紹怎樣用腳本來(lái)實(shí)現(xiàn)這樣的效果,但同時(shí)也會(huì)介紹在photoshop中和該腳本語(yǔ)言的相對(duì)應(yīng)的操作,從而讓大家更能明白怎樣去修改你的腳本來(lái)實(shí)現(xiàn)不同的效果。Photoshop能編譯三種編程語(yǔ)言的腳本:VBscript,AppleScript和JavaScript,其中只有JavaScript是跨平臺(tái)的腳本語(yǔ)言,所以在這篇教程中我們選擇使用JavaScript,同時(shí),學(xué)習(xí)JavaScript對(duì)于我們也更為有利。即使你從未使用JavaScript編過(guò)程,也能很輕易的理解這篇教程,因?yàn)槲覍?duì)每一概念都有很細(xì)節(jié)的講解。當(dāng)編寫(xiě)JS代碼的時(shí)候你可以使用任何適合你自己的編輯器,較新版本的ps為大家提供了一個(gè)叫做ExtendScript Tooklkit(以下簡(jiǎn)稱(chēng)ESTK)的軟件,可以讓編寫(xiě)這類(lèi)腳本更為便捷。通常情況下裝好ps都會(huì)附帶這個(gè)軟件,如果你安裝綠色版的ps或者確實(shí)找不到該軟件的話(譯者著:建議大家直接在開(kāi)始菜單搜索)可以從這里下載。注意:ESTK可能不適用于低版本的photoshop軟件。使用ESTK編寫(xiě)PS腳本語(yǔ)言的優(yōu)勢(shì)在于可以更方便的調(diào)試,你甚至可以在直接在該軟件里運(yùn)行腳本,這在接下來(lái)的學(xué)習(xí)中大家會(huì)深有體會(huì)。在這片教程中我使用了stock.xhng的這張圖片,你可以保存這張圖片的一個(gè)小尺寸版本來(lái)測(cè)試你的腳本,而且運(yùn)行速度會(huì)更快。當(dāng)然,腳本語(yǔ)言能應(yīng)對(duì)不同圖片的不同尺寸。

步驟一

打開(kāi)你想使用的編輯器,不管是ESTK還是windows平臺(tái)下的notepad之類(lèi)的文本編輯器,但不要使用word這類(lèi)的程序。如果你使用ESTK,那么窗口的左上角應(yīng)該會(huì)出現(xiàn)一個(gè)下拉菜單,在這個(gè)下拉列表中選擇adobe photoshop就能和ps程序鏈接起來(lái)。現(xiàn)在我們來(lái)編寫(xiě)一段簡(jiǎn)單的程序來(lái)驗(yàn)證我們的設(shè)置的正確性。將如下的代碼輸入你的編輯器:

Alert(“Hello World”)

這條簡(jiǎn)單命令的作用是彈出一個(gè)警告框,顯示“Hello World”;在這篇教程的過(guò)程中我們用警告彈出框來(lái)測(cè)試我們的部分代碼。使用引號(hào)的是表明引號(hào)內(nèi)的字符串是一個(gè)字符。現(xiàn)在運(yùn)行你的腳本,如果你使用的是像notepad之類(lèi)的常規(guī)編輯器,那么運(yùn)行你腳本最簡(jiǎn)單的方法就是將你的腳本儲(chǔ)存為“myscript.jsx”,然后打開(kāi)ps,文件>腳本>瀏覽,然后選擇你的腳本。如果你使用的是ESTK,你就只需要點(diǎn)擊窗口右上角的播放按鈕就可以了。這時(shí)候你應(yīng)該能看到一個(gè)警告彈出框。在測(cè)試你的腳本之前,請(qǐng)關(guān)閉當(dāng)前在ps中打開(kāi)的文件。

PS高端教程:在PS中用腳本語(yǔ)言來(lái)處理圖片

步驟二

編輯器中的警告代碼段只是來(lái)測(cè)試設(shè)置的正確性,所以這時(shí)候我們要把它刪掉。每次運(yùn)行腳本的時(shí)候我們都想要運(yùn)用兩個(gè)設(shè)置,分別是設(shè)置ps的標(biāo)尺單位為像素和禁止在非需要的情況下出現(xiàn)彈出對(duì)話框。在ps內(nèi)實(shí)現(xiàn)該設(shè)置的方法是 編輯>首選項(xiàng)>單位和標(biāo)尺,然后將標(biāo)尺的值改為像素,顯然關(guān)閉對(duì)話框只針對(duì)腳本語(yǔ)言控制程序的情況。實(shí)現(xiàn)該設(shè)置的代碼如下:

preferences.rulerUnits = Units.PIXELS;

displayDialogs =DialogModes.NO

第一條命令指令PS更改首選項(xiàng)里的單位和標(biāo)尺的值為像素。我們可以發(fā)現(xiàn)代碼的引用有明顯的分層結(jié)構(gòu),比如說(shuō)單位和標(biāo)尺是屬于首選項(xiàng)下面的一個(gè)子選項(xiàng),顯而易見(jiàn),Photoshop的軟件結(jié)構(gòu)也是如此。第二條命令只是將對(duì)話框的屬性值改為“NO”,在執(zhí)行腳本的過(guò)程中如果你需要彈出對(duì)話框,可以直接更改NO為YES。

步驟三

現(xiàn)在我們希望用戶選擇一個(gè)文件打開(kāi),為此我們需要彈出一個(gè)打開(kāi)文件的對(duì)話框,即使我們關(guān)閉了對(duì)話框的顯示但是我們只要編些腳本依然可以控制對(duì)話框的顯示。下面我們將定義一個(gè)和打開(kāi)的文件對(duì)應(yīng)的變量,然后復(fù)制該文件的背景層。實(shí)現(xiàn)代碼如下:

open(File(openDialog()));

var docRef_1 = activeDocument

docRef_1.backgroundLayer.duplicate();

第一條命令由三部分組成,the open命令是用來(lái)打開(kāi)括號(hào)內(nèi)的文件,然后the file()命令是抓取括號(hào)里的文件路徑,但這里我們添加的是openDialog()命令。所以該命令行的作用是彈出一個(gè)對(duì)話框讓用戶選擇一個(gè)文件,然后程序能獲取文件路徑并打開(kāi)它。如果你每次都想打開(kāi)同一個(gè)文件,那么你可以用具體的文件路徑來(lái)代替openDialog()代碼片段。第二條命令我用var來(lái)定義了一個(gè)變量docRef_1,該變量名可以是規(guī)范內(nèi)的任意值,如果我還想打開(kāi)另一個(gè)文件,我就可以定一個(gè)名為docRef_2的變量。然后我們把變量docRef_1定義為當(dāng)前文件。最后一條命令我們所做的是指令Photoshop復(fù)制docRef_1文件中的背景圖層,該文件目前也是我們唯一運(yùn)行的文件。大家會(huì)再次發(fā)現(xiàn)這和我們?cè)趐s中的操作類(lèi)似,在ps中,你會(huì)選擇你想要復(fù)制圖層所在的文件,然后你要選擇該文件中你要復(fù)制的圖層并復(fù)制它。現(xiàn)在運(yùn)行完整的代碼我們將得到一個(gè)擁有你選擇的圖片的背景圖層和在其上方的復(fù)制層。如果要在photoshop中完成同樣的操作你只需要簡(jiǎn)單的按Ctrl+O,然后選擇圖片,隨后右擊圖層面板的背景圖層,選擇“復(fù)制圖層”。

PS高端教程:在PS中用腳本語(yǔ)言來(lái)處理圖片

步驟四

下面我將講解如何用十六進(jìn)制代碼來(lái)定義顏色,同時(shí)大家也將看到顏色也可以由RGB的值來(lái)表述。在這里我們將定一個(gè)白色和一個(gè)黑色,然后將黑色設(shè)為前景色,白色設(shè)為背景色。實(shí)現(xiàn)這個(gè)目的有很多其他的方法,但在這個(gè)教程里面我們采用這樣的腳本命令:

var white = new SolidColor();

white.rgb["hexValue"] = "ffffff";

var black = new SolidColor();

black.rgb["hexValue"] = "000000";

foregroundColor =black;

backgroundColor = white

大家很容易就能發(fā)現(xiàn)前兩行代碼和三、四行類(lèi)似,我們?cè)谶@里所做的就是定義兩個(gè)可以任意命名的變量,這里我們根據(jù)即將給變量賦于的顏色命名。隨后我們定義該變量”= new SolidColor()”,則是一個(gè)創(chuàng)造新顏色的函數(shù)。隨后便是給該顏色變量定義一個(gè)十六進(jìn)制的顏色變量,這里是白色我們用”#ffffff”。我們最終要說(shuō)明的就是變量white就是指白色,black就是指黑色,最后兩行代碼的目的是設(shè)置前景色為黑色背景色為白色。這段代碼是相當(dāng)淺顯可讀的。在PS軟件內(nèi)與之等價(jià)的操作便是點(diǎn)擊“D”鍵充值背景色和前景色。現(xiàn)在試試在ps軟件中給前景色和背景色設(shè)置任意的值,然后運(yùn)行整段代碼仍然可以的大相同的結(jié)果,前景色和背景色都將恢復(fù)設(shè)置。

步驟五

下面我們要做的是將背景填充我們?cè)谏弦徊襟E中定義的白色。為了實(shí)現(xiàn)該目的我們首先要全選該文件的畫(huà)布區(qū)域然后填充選區(qū)。代碼如下:

docRef_1.selection.selectAll();

docRef_1.selection.fill(white);

docRef_1.selection.deselect();

第一行命令采用了selectAll()函數(shù)來(lái)定義了一個(gè)選區(qū),對(duì)于任何可以作用于不同文件的命令我們必須要告知ps我們正在處理的文件,即使當(dāng)前只有一個(gè)打開(kāi)的文件。第二條命令是指令ps對(duì)選取填充白色。有時(shí)候挺讓人迷惑的,因?yàn)榇蠹一蛟S會(huì)想到給選區(qū)填充白色的命令應(yīng)該是docRef_1.selection.fill = white,而這也并不是毫無(wú)道理。然而這并不是正確的代碼,此時(shí)ESTK的提示功能就非常有用了,只要你輸入fill或者其他關(guān)鍵詞,它就會(huì)以下拉框的形式告訴你該關(guān)鍵詞的正確用法。第三行代碼淺顯易懂,就是取消選區(qū),等同于ps中的ctrl+D。再次測(cè)試代碼你將得到一個(gè)白色的背景圖層和其上的圖片圖層。在ps軟件中,目前所有的腳本控制可以由ctrl+A和shift+F5來(lái)全選和填充來(lái)實(shí)現(xiàn)相同的效果。

步驟六

在接下來(lái)的兩個(gè)步驟中我們將用腳本語(yǔ)言來(lái)找到圖片的平均顏色值,隨后我們將根據(jù)這個(gè)顏色值來(lái)確定將如何編輯該圖片。這段代碼可以有很多其他用處,比如說(shuō)你可以用一段類(lèi)似的代碼通過(guò)分析圖片的顏色組成來(lái)建立一個(gè)顏色圖表。在這一步中我們將復(fù)制圖片圖層然后對(duì)該層施加平均模糊濾鏡進(jìn)而找到圖像的平均顏色值,并將圖層填充為該平均色。代碼如下:

docRef_1.layers[0].duplicate();

docRef_1.activeLayer=docRef_1.layers[0];

docRef_1.activeLayer.applyAverage();

第一行命令大家很熟悉,我們?cè)诓襟E三中使用過(guò)相同的命令,只是這里我們將背景圖層換成了layer[0]。為了很好的理解layer[0]的含義我們需要了解一點(diǎn)JavaScript中關(guān)于數(shù)組的知識(shí)。數(shù)組簡(jiǎn)單的來(lái)說(shuō)就是有不同值的變量集合,在一個(gè)數(shù)組中,變量就像是帶有獨(dú)立信息的盒子,而數(shù)組則像是一個(gè)大盒子,里面裝了很多貼有從零到無(wú)窮大的數(shù)字標(biāo)簽的小盒子。比如你想建立一個(gè)包含一周前三天的數(shù)組,你可以編寫(xiě)如下代碼:

var days = ["Monday", "Tuesday", "Wednesday"]

你可以采用如下代碼來(lái)引用該數(shù)組中的第一天:

days[0]

這就等同于“Monday”,當(dāng)然這里還沒(méi)有涉及到后兩行代碼。了解了數(shù)組的基礎(chǔ)知識(shí)后我們可以回過(guò)頭去看看我們剛剛所添加的三行代碼。在第一行當(dāng)中,layers是一個(gè)包含當(dāng)前文件所有圖層的數(shù)組。在圖層面板的最頂層是數(shù)組的第一個(gè)子元素,對(duì)應(yīng)為layers[0]而不是layers[1]因?yàn)閿?shù)組的子元素是從0開(kāi)始計(jì)數(shù)的。第二行腳本語(yǔ)句將頂部圖層設(shè)置為活動(dòng)圖層,等效于在圖層面板中選中某個(gè)圖層。我們沒(méi)有必要改變活動(dòng)圖層但它讓接下來(lái)的工作變得更加簡(jiǎn)單。最后一行腳本是對(duì)活動(dòng)圖層施加一個(gè)平均模糊濾鏡,該腳本的代碼格式與我們目前為止用到的命令格式基本一致,即是所謂的方法,通常是document.layer.function的格式,在這個(gè)實(shí)例中l(wèi)ayer(圖層)是指當(dāng)前的活動(dòng)圖層,而函數(shù)則是指平均模糊。這在photoshop軟件中可以通過(guò)濾鏡〉模糊〉平均來(lái)實(shí)現(xiàn)。再一次測(cè)試你的代碼,我們應(yīng)該可以在圖片所在的圖層上方得到一個(gè)填充了顏色的新圖層。

PS高端教程:在PS中用腳本語(yǔ)言來(lái)處理圖片

步驟七

這一步會(huì)略微復(fù)雜一點(diǎn),我們要用腳本語(yǔ)言找出步驟六中得到的填充圖層顏色的RGB值。實(shí)現(xiàn)這個(gè)目的沒(méi)有所謂的捷徑,我使用的方法是首先用腳本命令選中第一個(gè)紅色通道,然后獲取到它的直方圖,再?gòu)?到255對(duì)該直方圖的值進(jìn)行校驗(yàn),直到發(fā)現(xiàn)一個(gè)非零值即為R的數(shù)值,然后對(duì)綠色和藍(lán)色通道重復(fù)同樣的方法。這個(gè)過(guò)程在photoshop軟件中會(huì)更加好理解。如果你還沒(méi)有跟隨我們腳本的節(jié)奏打開(kāi)文件,那么再執(zhí)行一次以上的腳本。然后在ps軟件中,通過(guò)窗口>通道打開(kāi)通道面板,選擇紅色通道,此時(shí)其他通道都會(huì)被暫時(shí)隱藏,畫(huà)布中的圖像則是灰度模式。使用快捷鍵Ctrl+L打開(kāi)色階調(diào)節(jié)面板,我們將看到只有一條垂直線的直方圖,拖動(dòng)輸出色階滑塊中的一個(gè)大致位于這條線的下面,對(duì)應(yīng)的表單框里顯示則是R的數(shù)值。可以用同樣的方法來(lái)獲取G和B的數(shù)值。獲取R值的腳本如下,大家可以根據(jù)該原理寫(xiě)出獲取G和B值的腳本:

for (RLevel = 0; RLevel <= 255; RLevel ++)

{ if (docRef_1.channels["Red"].histogram[RLevel]) { break; } }

這段代碼是一個(gè)“for循環(huán)”,第一行代碼是指RLevel從0開(kāi)始,以增量1循環(huán)到255。RLevel++是指RLevel的增量為1。循環(huán)語(yǔ)句內(nèi)部是一個(gè)“if條件語(yǔ)句”,只有當(dāng)小括號(hào)里的條件為真時(shí),程序才會(huì)執(zhí)行花括號(hào)里的代碼。小括號(hào)內(nèi)的代碼是指讓ps獲取docRef_1的紅色通道并且獲取直方圖對(duì)應(yīng)的數(shù)組。我們看到的直方圖并不像是一排小盒子組成的但事實(shí)上它是的,

對(duì)于每一個(gè)輸出的值,在水平方向從0到255都是一個(gè)對(duì)應(yīng)的垂直方向的值。在這個(gè)直方圖中可以看出只有一個(gè)輸出值和非零的值對(duì)應(yīng)那么RLevel的值就可以看作是輸出色階的值。因?yàn)槲覀儧](méi)有在小括號(hào)內(nèi)添加類(lèi)似等號(hào)或者大于號(hào)之類(lèi)的符號(hào),程序會(huì)在直方圖返回非零值的返回true,因?yàn)橹挥幸粋€(gè)非零值,那么該返回值即為R的值。If條件語(yǔ)句返回true時(shí)執(zhí)行的命令是break命令,這將終止循環(huán),所以在找到正確值后該段腳本即會(huì)停止。這兩個(gè)靠近的花括號(hào)則是為了結(jié)束“for循環(huán)”和“if條件語(yǔ)句”。

PS高端教程:在PS中用腳本語(yǔ)言來(lái)處理圖片

步驟八

如下我總結(jié)了目前所有的代碼,包括關(guān)于綠色通道和藍(lán)色通道顏色值的校驗(yàn):

open(File(openDialog()));

var docRef_1 = activeDocument;

docRef_1.backgroundLayer.duplicate();

var white = new SolidColor();

white.rgb["hexValue"] = "ffffff";

var black = new SolidColor();

black.rgb["hexValue"] = "000000";

foregroundColor = black;

backgroundColor = white;

docRef_1.selection.selectAll();

docRef_1.selection.fill(white);

docRef_1.selection.deselect();

docRef_1.layers[0].duplicate();

docRef_1.activeLayer = docRef_1.layers[0];

docRef_1.activeLayer.applyAverage();

for (RLevel = 0; RLevel <= 255; RLevel ++)

{ if (docRef_1.channels[0].histogram[RLevel]) { break; } }

for (GLevel = 0; GLevel <= 255; GLevel ++)

{ if (docRef_1.channels[1].histogram[GLevel]) { break; } }

for (BLevel = 0; BLevel <= 255; BLevel ++)

{ if (docRef_1.channels[2].histogram[BLevel]) { break; } }

(譯者注:channels[1]、channels[2]和channels[3]分別是指紅、綠、藍(lán)顏色通道)

現(xiàn)在我們來(lái)檢驗(yàn)最后一段代碼的可行性,我們用一個(gè)彈出框來(lái)顯示RGB的值。在以上代碼片段結(jié)尾處添加如下代碼:

alert(RLevel + ", " + GLevel + ", " + BLevel)

運(yùn)行腳本,該彈框中應(yīng)該會(huì)出現(xiàn)RGB的值,可以通過(guò)雙擊前景色切換到取色工具進(jìn)行驗(yàn)證。如果顏色匹配就刪掉這行代碼,如果不匹配或者運(yùn)行錯(cuò)誤的話仔細(xì)檢查或者直接復(fù)制以上代碼重復(fù)嘗試。

PS高端教程:在PS中用腳本語(yǔ)言來(lái)處理圖片

步驟九

從現(xiàn)在起我不再反復(fù)去搗那些細(xì)枝末節(jié)的東西因?yàn)榻酉聛?lái)涉及到的問(wèn)題基本都有講解過(guò)。基于平均色我們可以靈活的用多種方法來(lái)處理圖片。現(xiàn)在我們要做的是給圖層填充一個(gè)顏色并更改它的混合模式為顏色。當(dāng)然,該圖層的填充色的的來(lái)由也是依據(jù)的。如果平均色偏藍(lán),那么我們將使用黃色,如果偏綠我們則使用品紅,如果偏紅我們就使用藍(lán)綠色(青色)。我用一個(gè)較長(zhǎng)的步驟來(lái)實(shí)現(xiàn)這個(gè)效果同時(shí)給大家展現(xiàn)更多的命令規(guī)則。在這一步當(dāng)中,我們將獲得該填充色的RGB值。代碼如下:

var R = 0; var G = 0; var B = 0;

if (RLevel > GLevel && RLevel > BLevel) { R = 255; }

if (GLevel > BLevel && GLevel > RLevel) { G = 255; }

if (BLevel > RLevel && BLevel > GLevel) { B = 255; }

首先定義變量R、G、B并都賦值為0,然后用三個(gè)“if條件語(yǔ)句”來(lái)重新賦值,第一條條件語(yǔ)句表明如果平均色的RLevel值大于GLevel和BLevel那么R=255。對(duì)于G和B的值用同樣的方法判斷和執(zhí)行。如果很巧所有值都相等,那么R、G、B的值就保持為0。

步驟十

在這一步中我們根據(jù)上一步的結(jié)果新建一個(gè)顏色值,并用和步驟四和步驟五類(lèi)似的方法給圖層填充該顏色,代碼如下:

var color = new SolidColor();

color.rgb.red = R;

color.rgb.green = G;

color.rgb.blue = B;

docRef_1.selection.selectAllvel();

docRef_1.selection.fill(color);

docRef_1.selection.deselect();

唯一的區(qū)別是這里將變量命名為color,因?yàn)樗赡苁羌t色、綠色或者藍(lán)色,這個(gè)案例為藍(lán)色。

PS高端教程:在PS中用腳本語(yǔ)言來(lái)處理圖片

步驟十一

接下來(lái)執(zhí)行如下代碼:

docRef_1.activeLayer.invert();

docRef_1.activeLayer.blendMode = BlendMode.COLORBLEND;

docRef_1.activeLayer.opacity = 50;

docRef_1.activeLayer.merge();

這里的每條代碼應(yīng)該都像白話文一樣淺顯易懂,該過(guò)程在ps軟件中實(shí)現(xiàn)方法是:快捷鍵Ctrl+I圖層反相,然后更改圖層混合模式為顏色,并且在圖層面板修改圖層的不透明度最后Ctrl+E合并圖層。(譯者注:倡導(dǎo)無(wú)損編輯,杜絕輕易合并圖層)

運(yùn)行腳本,我們將得到下圖:

PS高端教程:在PS中用腳本語(yǔ)言來(lái)處理圖片

步驟十二

現(xiàn)在我們想給圖片添加一個(gè)邊框,我的實(shí)現(xiàn)方法是用腳本命令擴(kuò)大畫(huà)布,然后新建一個(gè)圖層并全選填充白色。在此之前我們需要根據(jù)圖片的尺寸算出邊框的合適尺寸。經(jīng)過(guò)一系列嘗試和失敗,我發(fā)現(xiàn)短邊的7.5%是較為合適的邊框厚度。當(dāng)然,我們首先要找出短邊再來(lái)算出它的7%,最后還要為畫(huà)布的寬度和高度增加雙倍的該尺寸。簡(jiǎn)而言之就是畫(huà)布的寬和高都要增加圖片短邊的15%。代碼如下:

var width = docRef_1.width;

var height = docRef_1.height;

if (width <= height) { var borderSize = Math.round(width * 0.15); }

else { var borderSize = Math.round(height * 0.15); }

docRef_1.resizeCanvas(width + borderSize, height + borderSize);

Okay,我們來(lái)分析一下這段腳本。前兩行代碼很簡(jiǎn)單,我們分別定義了一個(gè)變量等于該文件的寬度和高度。然后是一個(gè)“if條件語(yǔ)句”來(lái)聲明如果寬度小于或等于高度則執(zhí)行花括號(hào)內(nèi)的命令。命令的第一部分大家很熟悉,就是新建一個(gè)變量,第二部分則使用使用了一個(gè)叫做“round”的Math Function(數(shù)學(xué)函數(shù)),作用就是對(duì)括號(hào)里的任意數(shù)值取整。這樣做是因?yàn)橛袝r(shí)候?qū)挾然蛘吒叨鹊?5%可能為小數(shù)(譯者注:避免出現(xiàn)像素不精確的問(wèn)題)。接下來(lái)的“else”語(yǔ)句表明如果寬度大于高度則執(zhí)行該行代碼花括號(hào)里的命令。最后一行代碼根據(jù)邊框的厚度重新定義了畫(huà)布大小。注意圖片的周?chē)由狭?px的灰色邊框因?yàn)榭紤]到文章背景也是白色以示區(qū)分,和腳本操作無(wú)關(guān)。

PS高端教程:在PS中用腳本語(yǔ)言來(lái)處理圖片

步驟十三

現(xiàn)在你測(cè)試已有的腳本或許會(huì)覺(jué)得這看起來(lái)不錯(cuò),但是背景圖層會(huì)因?yàn)楫?huà)布尺寸的更改而變化,造成邊框尺寸的變化。所以我們需要新建一個(gè)圖層將邊框畫(huà)在里面并且和圖片所在的圖層合并。代碼如下:

docRef_1.artLayers.add();

docRef_1.activeLayer.move(docRef_1.backgroundLayer, ElementPlacement.PLACEBEFORE); docRef_1.selection.selectAll();

docRef_1.selection.fill(white);

docRef_1.selection.deselect();

docRef_1.layers[0].merge();

這段代碼中我們唯一不熟悉的部分就是我們用在即將創(chuàng)建的一個(gè)活動(dòng)圖層上的move(移動(dòng))命令。括號(hào)里的第一部分指明引用我們所定義的背景圖層,第二部分是用方法ElementPlacement.PLACEBEFORE移動(dòng)活動(dòng)圖層到引用的圖層(即這里的背景層)上方。

?

步驟十四

下面我們來(lái)添加圖片的陰影圖層,這將成為背景圖層上方一個(gè)黑色填充層。代碼如下:

docRef_1.artLayers.add();

docRef_1.activeLayer.move(docRef_1.backgroundLayer,ElementPlacement.PLACEBEFORE); docRef_1.selection.selectAll();

docRef_1.selection.fill(black);

docRef_1.selection.deselect();

這段代碼和上一步的幾乎相同,只是我們給該圖層填充了黑色,同時(shí)也還沒(méi)有合并圖層。如果這時(shí)候你運(yùn)行腳本,就畫(huà)布中的內(nèi)容而言應(yīng)該看不出和上一步有什么變化。

 

步驟十五

Okay,下面我想要再次擴(kuò)展畫(huà)布讓它能適應(yīng)圖片任意角度的旋轉(zhuǎn),這需要一點(diǎn)簡(jiǎn)單的畢達(dá)哥拉斯經(jīng)典定理。代碼如下:

var width = docRef_1.width;

var height = docRef_1.height;

var newSize = Math.round(Math.sqrt(width * width + height * height)) + borderSize; docRef_1.resizeCanvas(newSize, newSize)

前兩行代碼為寬度和高度各自定義了一個(gè)變量。第三行則為當(dāng)前文件的新尺寸定義了一個(gè)變量,函數(shù)Math.sqrt 是指對(duì)括號(hào)里的內(nèi)容開(kāi)根號(hào),最后我們加上了邊框的距離最主要是考慮到我們要施加的陰影圖層。最后一行重定了畫(huà)布大小。

PS高端教程:在PS中用腳本語(yǔ)言來(lái)處理圖片

步驟十六

為了創(chuàng)建陰影,我們希望能用腳本控制之前創(chuàng)建黑色圖層對(duì)它施加一個(gè)高斯模糊濾鏡。

通過(guò)嘗試我發(fā)現(xiàn)高斯模糊的大小用邊框的1/3,不透明度采用50%能達(dá)到較好的效果。該部分代碼如下:

docRef_1.activeLayer.applyGaussianBlur(borderSize / 3);

docRef_1.activeLayer.opacity = 50;

第一行的代碼原理同第六步中我們對(duì)圖片所在圖層施加平均模糊濾鏡。

PS高端教程:在PS中用腳本語(yǔ)言來(lái)處理圖片

步驟十七

現(xiàn)在我們想用腳本控制圖片和陰影一起旋轉(zhuǎn),然后合并它們,這比先合并后旋轉(zhuǎn)能得到更好的結(jié)果。我們希望腳本能夠?qū)崿F(xiàn)圖片每次的旋轉(zhuǎn)尺寸是-20°到20°之間的隨機(jī)值,可以編寫(xiě)如下代碼:

var angle = Math.round(Math.random() * 40) - 20; docRef_1.activeLayer.rotate(angle, AnchorPosition.MIDDLECENTER); docRef_1.activeLayer = docRef_1.layers[0]; docRef_1.activeLayer.rotate(angle, AnchorPosition.MIDDLECENTER); docRef_1.activeLayer.merge();

在第一行代碼中,函數(shù)Math.random可以得到一個(gè)0到1之間的隨機(jī)值,不是一個(gè)整數(shù),這也是我們使用Math.round取整函數(shù)的原因。為了得到-20到20之間的隨機(jī)數(shù),我們用40與0到1之間的小數(shù)相乘并且對(duì)結(jié)果取整,再減去20,將所得的結(jié)果保存在變量angle中。下面執(zhí)行旋轉(zhuǎn)操作的代碼將作用于當(dāng)前的活動(dòng)圖層即陰影層,第二行代碼括號(hào)里定義了旋轉(zhuǎn)的角度為angle,而錨點(diǎn)的位置則是中心點(diǎn)。在ps軟件中可以用過(guò)快捷鍵Ctrl+T執(zhí)行旋轉(zhuǎn)操作。最后三行代碼執(zhí)行了選中圖片圖層,和陰影圖層旋轉(zhuǎn)相同角度并且合并的操作。結(jié)果如下圖:

PS高端教程:在PS中用腳本語(yǔ)言來(lái)處理圖片

最終代碼

//步驟二? 初始化

preferences.rulerUnits = Units.PIXELS;

displayDialogs = DialogModes.NO

//步驟三? 打開(kāi)文件、復(fù)制背景層

open(File(openDialog()));

var docRef_1 = activeDocument;

docRef_1.backgroundLayer.duplicate();

//步驟四? 定義黑色和白色的十六進(jìn)制顏色值,更改前景色和背景色

var white = new SolidColor();

white.rgb["hexValue"] = "ffffff";

var black = new SolidColor();

black.rgb["hexValue"] = "000000";

foregroundColor = black;

backgroundColor = white;

//步驟五? 填充白色

docRef_1.selection.selectAll();

docRef_1.selection.fill(white);

docRef_1.selection.deselect();

//步驟六? 復(fù)制圖片圖層并施加平均模糊濾鏡

docRef_1.layers[0].duplicate();

docRef_1.activeLayer = docRef_1.layers[0];

docRef_1.activeLayer.applyAverage();

//步驟七? 通過(guò)通道直方圖取步驟六得到的平均色填充層的顏色

for (RLevel = 0; RLevel <= 255; RLevel ++) { if (docRef_1.channels[0].histogram[RLevel]) { break; } }

for (GLevel = 0; GLevel <= 255; GLevel ++) { if (docRef_1.channels[1].histogram[GLevel]) { break; } }

for (BLevel = 0; BLevel <= 255; BLevel ++) { if (docRef_1.channels[2].histogram[BLevel]) { break; } }

//步驟九? 調(diào)色

var R = 0; var G = 0; var B = 0;

if (RLevel > GLevel && RLevel > BLevel) { R = 255; }

if (GLevel > BLevel && GLevel > RLevel) { G = 255; }

if (BLevel > RLevel && BLevel > GLevel) { B = 255; }

//步驟十? 填色

var color = new SolidColor();

color.rgb.red = R; color.rgb.green = G; color.rgb.blue = B;

docRef_1.selection.selectAll();

docRef_1.selection.fill(color);

docRef_1.selection.deselect();

//步驟十一? 填色層反相,更改混合模式為顏色,降低不透明度,合并圖層

docRef_1.activeLayer.invert();

docRef_1.activeLayer.blendMode = BlendMode.COLORBLEND;

docRef_1.activeLayer.opacity = 50;

docRef_1.activeLayer.merge();

//步驟十二? 重定畫(huà)布大小

var width = docRef_1.width;

var height = docRef_1.height;

if (width <= height) { var borderSize = Math.round(width * 0.15); }

else { var borderSize = Math.round(height * 0.15); }

docRef_1.resizeCanvas(width + borderSize, height + borderSize);

//步驟十三? 增加邊框

docRef_1.artLayers.add();

docRef_1.activeLayer.move(docRef_1.backgroundLayer, ElementPlacement.PLACEBEFORE); docRef_1.selection.selectAll();

docRef_1.selection.fill(white);

docRef_1.selection.deselect();

docRef_1.layers[0].merge();

//步驟十四? 添加黑色填充層,為添加陰影做好準(zhǔn)備

docRef_1.artLayers.add();

docRef_1.activeLayer.move(docRef_1.backgroundLayer, ElementPlacement.PLACEBEFORE);

docRef_1.selection.selectAll();

docRef_1.selection.fill(black);

docRef_1.selection.deselect();

//步驟十五? 再次增加畫(huà)布大小 ,適應(yīng)圖片任意角度旋轉(zhuǎn)

var width = docRef_1.width;

var height = docRef_1.height;

var newSize = Math.round(Math.sqrt(width * width + height * height)) + borderSize;

docRef_1.resizeCanvas(newSize, newSize);

//步驟十六? 對(duì)黑色填充層施加高斯模糊濾鏡,陰影展現(xiàn)

docRef_1.activeLayer.applyGaussianBlur(borderSize / 3);

docRef_1.activeLayer.opacity = 50;

//步驟十七? 對(duì)圖片圖層和陰影圖層隨機(jī)旋轉(zhuǎn)相同角度,合并

var angle = Math.round(Math.random() * 40) - 20;

docRef_1.activeLayer.rotate(angle, AnchorPosition.MIDDLECENTER);

docRef_1.activeLayer = docRef_1.layers[0];

docRef_1.activeLayer.rotate(angle,AnchorPosition.MIDDLECENTER);

docRef_1.activeLayer.merge();

結(jié)語(yǔ)

這只是ps腳本語(yǔ)言的一個(gè)入門(mén),重在理解它的方法和思想。如果你能閱讀官方api文檔繼續(xù)學(xué)習(xí),或許能實(shí)現(xiàn)很多手動(dòng)操作軟件無(wú)法實(shí)現(xiàn)的效果。
或者你代碼能力夠強(qiáng),也能用腳本語(yǔ)言為大家編寫(xiě)ps外掛濾鏡和插件。當(dāng)然,最重要的還是對(duì)設(shè)計(jì)的理解和追求,這要?jiǎng)龠^(guò)所有的軟件技巧。

原文標(biāo)題:Manipulate an Image with Scripting
原文地址:photoshoptutorials
優(yōu)設(shè)網(wǎng) SDC翻茄匠:@Gaoyoungor

 
================關(guān)于優(yōu)設(shè)網(wǎng)================
"優(yōu)設(shè)網(wǎng)uisdc.com"是一個(gè)分享網(wǎng)頁(yè)設(shè)計(jì)、無(wú)線端設(shè)計(jì)以及PS教程的干貨網(wǎng)站。
【特色推薦】
設(shè)計(jì)講座:每月邀請(qǐng)國(guó)內(nèi)互聯(lián)網(wǎng)公司設(shè)計(jì)前輩及行業(yè)總監(jiān)在群內(nèi)及YY語(yǔ)音(YY頻道:15335158)分享實(shí)戰(zhàn)經(jīng)驗(yàn)。
設(shè)計(jì)微博:擁有粉絲量40萬(wàn)的人氣微博@優(yōu)秀網(wǎng)頁(yè)設(shè)計(jì) ,歡迎關(guān)注獲取網(wǎng)頁(yè)設(shè)計(jì)資源、下載頂尖設(shè)計(jì)素材。
設(shè)計(jì)導(dǎo)航:全球頂尖設(shè)計(jì)網(wǎng)站推薦,設(shè)計(jì)師必備導(dǎo)航:http://hao.uisdc.com
———————————————————–
想在手機(jī)上、被窩里獲取設(shè)計(jì)教程、經(jīng)驗(yàn)分享和各種意想不到的"福利"嗎?
添加 優(yōu)秀網(wǎng)頁(yè)設(shè)計(jì) 微信號(hào):【youshege】?jī)?yōu)設(shè)哥的全拼
您也可以通過(guò)掃描下方二維碼快速添加:

PS高端教程:在PS中用腳本語(yǔ)言來(lái)處理圖片
 

收藏
點(diǎn)贊

復(fù)制本文鏈接 文章為作者獨(dú)立觀點(diǎn)不代表優(yōu)設(shè)網(wǎng)立場(chǎng),未經(jīng)允許不得轉(zhuǎn)載。