PS高端教程:在PS中用腳本語言來處理圖片

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

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

原文標題:Manipulate an Image with Scripting
原文地址:photoshoptutorials
優設網 SDC翻茄匠:@Gaoyoungor

正文:

PS中用腳本語言來處理圖片

PS高端教程:在PS中用腳本語言來處理圖片

腳本控制在常規的ps教程中是很少涉及到的東西,但絕對是值得學習的技巧。腳本在自動化任務流程控制方面相對于ps action(動作)來說更為強大,而且能完成一些利用photoshop常規軟件技巧不能實現的任務。下面我們來創建一個腳本來編輯照片,讓你的圖片以一種更為時髦的方式去展示。

介紹

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

步驟一

打開你想使用的編輯器,不管是ESTK還是windows平臺下的notepad之類的文本編輯器,但不要使用word這類的程序。如果你使用ESTK,那么窗口的左上角應該會出現一個下拉菜單,在這個下拉列表中選擇adobe photoshop就能和ps程序鏈接起來。現在我們來編寫一段簡單的程序來驗證我們的設置的正確性。將如下的代碼輸入你的編輯器:

Alert(“Hello World”)

這條簡單命令的作用是彈出一個警告框,顯示“Hello World”;在這篇教程的過程中我們用警告彈出框來測試我們的部分代碼。使用引號的是表明引號內的字符串是一個字符。現在運行你的腳本,如果你使用的是像notepad之類的常規編輯器,那么運行你腳本最簡單的方法就是將你的腳本儲存為“myscript.jsx”,然后打開ps,文件>腳本>瀏覽,然后選擇你的腳本。如果你使用的是ESTK,你就只需要點擊窗口右上角的播放按鈕就可以了。這時候你應該能看到一個警告彈出框。在測試你的腳本之前,請關閉當前在ps中打開的文件。

PS高端教程:在PS中用腳本語言來處理圖片

步驟二

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

preferences.rulerUnits = Units.PIXELS;

displayDialogs =DialogModes.NO

第一條命令指令PS更改首選項里的單位和標尺的值為像素。我們可以發現代碼的引用有明顯的分層結構,比如說單位和標尺是屬于首選項下面的一個子選項,顯而易見,Photoshop的軟件結構也是如此。第二條命令只是將對話框的屬性值改為“NO”,在執行腳本的過程中如果你需要彈出對話框,可以直接更改NO為YES。

步驟三

現在我們希望用戶選擇一個文件打開,為此我們需要彈出一個打開文件的對話框,即使我們關閉了對話框的顯示但是我們只要編些腳本依然可以控制對話框的顯示。下面我們將定義一個和打開的文件對應的變量,然后復制該文件的背景層。實現代碼如下:

open(File(openDialog()));

var docRef_1 = activeDocument

docRef_1.backgroundLayer.duplicate();

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

PS高端教程:在PS中用腳本語言來處理圖片

步驟四

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

var white = new SolidColor();

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

var black = new SolidColor();

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

foregroundColor =black;

backgroundColor = white

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

步驟五

下面我們要做的是將背景填充我們在上一步驟中定義的白色。為了實現該目的我們首先要全選該文件的畫布區域然后填充選區。代碼如下:

docRef_1.selection.selectAll();

docRef_1.selection.fill(white);

docRef_1.selection.deselect();

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

步驟六

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

docRef_1.layers[0].duplicate();

docRef_1.activeLayer=docRef_1.layers[0];

docRef_1.activeLayer.applyAverage();

第一行命令大家很熟悉,我們在步驟三中使用過相同的命令,只是這里我們將背景圖層換成了layer[0]。為了很好的理解layer[0]的含義我們需要了解一點JavaScript中關于數組的知識。數組簡單的來說就是有不同值的變量集合,在一個數組中,變量就像是帶有獨立信息的盒子,而數組則像是一個大盒子,里面裝了很多貼有從零到無窮大的數字標簽的小盒子。比如你想建立一個包含一周前三天的數組,你可以編寫如下代碼:

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

你可以采用如下代碼來引用該數組中的第一天:

days[0]

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

PS高端教程:在PS中用腳本語言來處理圖片

步驟七

這一步會略微復雜一點,我們要用腳本語言找出步驟六中得到的填充圖層顏色的RGB值。實現這個目的沒有所謂的捷徑,我使用的方法是首先用腳本命令選中第一個紅色通道,然后獲取到它的直方圖,再從0到255對該直方圖的值進行校驗,直到發現一個非零值即為R的數值,然后對綠色和藍色通道重復同樣的方法。這個過程在photoshop軟件中會更加好理解。如果你還沒有跟隨我們腳本的節奏打開文件,那么再執行一次以上的腳本。然后在ps軟件中,通過窗口>通道打開通道面板,選擇紅色通道,此時其他通道都會被暫時隱藏,畫布中的圖像則是灰度模式。使用快捷鍵Ctrl+L打開色階調節面板,我們將看到只有一條垂直線的直方圖,拖動輸出色階滑塊中的一個大致位于這條線的下面,對應的表單框里顯示則是R的數值??梢杂猛瑯拥姆椒▉慝@取G和B的數值。獲取R值的腳本如下,大家可以根據該原理寫出獲取G和B值的腳本:

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

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

這段代碼是一個“for循環”,第一行代碼是指RLevel從0開始,以增量1循環到255。RLevel++是指RLevel的增量為1。循環語句內部是一個“if條件語句”,只有當小括號里的條件為真時,程序才會執行花括號里的代碼。小括號內的代碼是指讓ps獲取docRef_1的紅色通道并且獲取直方圖對應的數組。我們看到的直方圖并不像是一排小盒子組成的但事實上它是的,

對于每一個輸出的值,在水平方向從0到255都是一個對應的垂直方向的值。在這個直方圖中可以看出只有一個輸出值和非零的值對應那么RLevel的值就可以看作是輸出色階的值。因為我們沒有在小括號內添加類似等號或者大于號之類的符號,程序會在直方圖返回非零值的返回true,因為只有一個非零值,那么該返回值即為R的值。If條件語句返回true時執行的命令是break命令,這將終止循環,所以在找到正確值后該段腳本即會停止。這兩個靠近的花括號則是為了結束“for循環”和“if條件語句”。

PS高端教程:在PS中用腳本語言來處理圖片

步驟八

如下我總結了目前所有的代碼,包括關于綠色通道和藍色通道顏色值的校驗:

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]分別是指紅、綠、藍顏色通道)

現在我們來檢驗最后一段代碼的可行性,我們用一個彈出框來顯示RGB的值。在以上代碼片段結尾處添加如下代碼:

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

運行腳本,該彈框中應該會出現RGB的值,可以通過雙擊前景色切換到取色工具進行驗證。如果顏色匹配就刪掉這行代碼,如果不匹配或者運行錯誤的話仔細檢查或者直接復制以上代碼重復嘗試。

PS高端教程:在PS中用腳本語言來處理圖片

步驟九

從現在起我不再反復去搗那些細枝末節的東西因為接下來涉及到的問題基本都有講解過?;谄骄覀兛梢造`活的用多種方法來處理圖片?,F在我們要做的是給圖層填充一個顏色并更改它的混合模式為顏色。當然,該圖層的填充色的的來由也是依據的。如果平均色偏藍,那么我們將使用黃色,如果偏綠我們則使用品紅,如果偏紅我們就使用藍綠色(青色)。我用一個較長的步驟來實現這個效果同時給大家展現更多的命令規則。在這一步當中,我們將獲得該填充色的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,然后用三個“if條件語句”來重新賦值,第一條條件語句表明如果平均色的RLevel值大于GLevel和BLevel那么R=255。對于G和B的值用同樣的方法判斷和執行。如果很巧所有值都相等,那么R、G、B的值就保持為0。

步驟十

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

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();

唯一的區別是這里將變量命名為color,因為它可能是紅色、綠色或者藍色,這個案例為藍色。

PS高端教程:在PS中用腳本語言來處理圖片

步驟十一

接下來執行如下代碼:

docRef_1.activeLayer.invert();

docRef_1.activeLayer.blendMode = BlendMode.COLORBLEND;

docRef_1.activeLayer.opacity = 50;

docRef_1.activeLayer.merge();

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

運行腳本,我們將得到下圖:

PS高端教程:在PS中用腳本語言來處理圖片

步驟十二

現在我們想給圖片添加一個邊框,我的實現方法是用腳本命令擴大畫布,然后新建一個圖層并全選填充白色。在此之前我們需要根據圖片的尺寸算出邊框的合適尺寸。經過一系列嘗試和失敗,我發現短邊的7.5%是較為合適的邊框厚度。當然,我們首先要找出短邊再來算出它的7%,最后還要為畫布的寬度和高度增加雙倍的該尺寸。簡而言之就是畫布的寬和高都要增加圖片短邊的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,我們來分析一下這段腳本。前兩行代碼很簡單,我們分別定義了一個變量等于該文件的寬度和高度。然后是一個“if條件語句”來聲明如果寬度小于或等于高度則執行花括號內的命令。命令的第一部分大家很熟悉,就是新建一個變量,第二部分則使用使用了一個叫做“round”的Math Function(數學函數),作用就是對括號里的任意數值取整。這樣做是因為有時候寬度或者高度的15%可能為小數(譯者注:避免出現像素不精確的問題)。接下來的“else”語句表明如果寬度大于高度則執行該行代碼花括號里的命令。最后一行代碼根據邊框的厚度重新定義了畫布大小。注意圖片的周圍加上了1px的灰色邊框因為考慮到文章背景也是白色以示區分,和腳本操作無關。

PS高端教程:在PS中用腳本語言來處理圖片

步驟十三

現在你測試已有的腳本或許會覺得這看起來不錯,但是背景圖層會因為畫布尺寸的更改而變化,造成邊框尺寸的變化。所以我們需要新建一個圖層將邊框畫在里面并且和圖片所在的圖層合并。代碼如下:

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();

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

?

步驟十四

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

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();

這段代碼和上一步的幾乎相同,只是我們給該圖層填充了黑色,同時也還沒有合并圖層。如果這時候你運行腳本,就畫布中的內容而言應該看不出和上一步有什么變化。

 

步驟十五

Okay,下面我想要再次擴展畫布讓它能適應圖片任意角度的旋轉,這需要一點簡單的畢達哥拉斯經典定理。代碼如下:

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)

前兩行代碼為寬度和高度各自定義了一個變量。第三行則為當前文件的新尺寸定義了一個變量,函數Math.sqrt 是指對括號里的內容開根號,最后我們加上了邊框的距離最主要是考慮到我們要施加的陰影圖層。最后一行重定了畫布大小。

PS高端教程:在PS中用腳本語言來處理圖片

步驟十六

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

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

docRef_1.activeLayer.applyGaussianBlur(borderSize / 3);

docRef_1.activeLayer.opacity = 50;

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

PS高端教程:在PS中用腳本語言來處理圖片

步驟十七

現在我們想用腳本控制圖片和陰影一起旋轉,然后合并它們,這比先合并后旋轉能得到更好的結果。我們希望腳本能夠實現圖片每次的旋轉尺寸是-20°到20°之間的隨機值,可以編寫如下代碼:

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();

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

PS高端教程:在PS中用腳本語言來處理圖片

最終代碼

//步驟二? 初始化

preferences.rulerUnits = Units.PIXELS;

displayDialogs = DialogModes.NO

//步驟三? 打開文件、復制背景層

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; } }

//步驟九? 調色

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();

//步驟十二? 重定畫布大小

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();

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

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();

//步驟十五? 再次增加畫布大小 ,適應圖片任意角度旋轉

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);

//步驟十六? 對黑色填充層施加高斯模糊濾鏡,陰影展現

docRef_1.activeLayer.applyGaussianBlur(borderSize / 3);

docRef_1.activeLayer.opacity = 50;

//步驟十七? 對圖片圖層和陰影圖層隨機旋轉相同角度,合并

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();

結語

這只是ps腳本語言的一個入門,重在理解它的方法和思想。如果你能閱讀官方api文檔繼續學習,或許能實現很多手動操作軟件無法實現的效果。
或者你代碼能力夠強,也能用腳本語言為大家編寫ps外掛濾鏡和插件。當然,最重要的還是對設計的理解和追求,這要勝過所有的軟件技巧。

原文標題:Manipulate an Image with Scripting
原文地址:photoshoptutorials
優設網 SDC翻茄匠:@Gaoyoungor

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

PS高端教程:在PS中用腳本語言來處理圖片
 

收藏
點贊

復制本文鏈接 文章為作者獨立觀點不代表優設網立場,未經允許不得轉載。