接下來我們開始編寫腳本,為了通俗,這一步主要只是談?wù)勊悸?/strong>
首先測(cè)試單個(gè)文件,腳本大致需要執(zhí)行如下步驟:
- 移動(dòng)到最底層
- 向上移動(dòng)一層,利用 activeLayer.bounds 記錄層范圍坐標(biāo),并把坐標(biāo)記錄下來
- 反復(fù)執(zhí)行第2步,直到最頂層
- 輸出記錄
有了以前一些腳本的經(jīng)驗(yàn),實(shí)現(xiàn)上面這個(gè)功能沒有碰到什么難度,很容易搞定。
然后就是批量處理了,借鑒 xiexienila 的變更尺寸腳本 ,該腳本已經(jīng)有完善的批量打開、保存處理模塊。局部Copy后稍加修改,就讓我們的腳本實(shí)現(xiàn)了如下功能:
- 用戶選擇待處理文件夾
- 獲取該文件夾下所有文件
- 打開一個(gè)文件,獲取并記錄所有需要的坐標(biāo),關(guān)閉不保存
- 重復(fù)第3步,直至處理完所有文件
- 輸出記錄
測(cè)試成功后,想到:既然已經(jīng)動(dòng)用腳本獲取了所有坐標(biāo),索性把兩張不同的圖片也輸出保存好了。于是添加了一個(gè)保存位置選擇。 并對(duì)單個(gè)文件內(nèi)的操作作了修改:
- 移動(dòng)到最底層
- 打開最底層智能對(duì)象
- 另存智能對(duì)象為jpg文檔(xxx_1)
- 隱藏智能對(duì)象里的最上層,也就是我們修改過的那層
- 再次另存智能對(duì)象為jpg文檔(xxx_0)
- 不保存關(guān)閉智能對(duì)象(回到原文檔)
- 向上移動(dòng)一層,利用 activeLayer.bounds 記錄層范圍坐標(biāo),并把坐標(biāo)記錄下來
- 反復(fù)執(zhí)行第7步,直到最頂層
這樣不但記錄了坐標(biāo)數(shù)據(jù),還順便把智能對(duì)象里面的兩個(gè)層都輸出為jpg圖像了。
后來,由于第二張圖片和第一張圖片很多相同的地方,導(dǎo)致游戲文件體積較大,所以想了一個(gè)解決辦法,就是把相同的部分用黑色擋住,只保留不同的地方,這樣jpg就小很多。也許是個(gè)笨辦法吧,畢竟不太清楚別人怎么做的,這里只是給大家說說思路罷了。
于是再次修改單個(gè)文件內(nèi)的操作部分
- 移動(dòng)到最底層
- 向上移動(dòng)一層,利用activeLayer.bounds 記錄層范圍坐標(biāo),并把坐標(biāo)記錄下來
- 反復(fù)執(zhí)行第2步,直到最頂層
- 再次回到最底層
- 打開最底層智能對(duì)象
- 利用記錄的坐標(biāo),建立選區(qū)(增加模式),全部選區(qū)增添完后,反選
- 填充黑色(這時(shí)候是填充在智能對(duì)象內(nèi)部最上層上,也就是我們修改過的那層)
- 另存為智能對(duì)象為jpg文檔(xxx_1)
- 隱藏當(dāng)前圖層
- 再次另存智能對(duì)象為jpg文檔(xxx_0)
- 不保存關(guān)閉智能對(duì)象(回到原文檔)
這樣我們就給修改過的圖像增添了一個(gè)黑色部分,擋住了沒動(dòng)過的地方,只留下了差異處。為了減少jpg 保存可能對(duì)邊緣造成的影響,所以黑色部分的填充范圍縮小了2像素。后來為了修改方便,索性在面板上放了一個(gè)位置,可以手動(dòng)輸入縮小量。
為了程序調(diào)用方便,腳本還順便實(shí)現(xiàn)其他一些功能: 比如把文件名作些規(guī)范處理:按照數(shù)字大小排序文件(否則打開順序會(huì)是1、11、12、2、21這樣),并且把1.psd 、2.psd 之類的記錄為 0001、0002; 用簡單正則替換去掉坐標(biāo)記錄轉(zhuǎn)換為字符串后的“ px”單位等等。 為了處理時(shí)對(duì)進(jìn)度有個(gè)掌握,腳本界面上還放了進(jìn)度條。
最后,發(fā)現(xiàn)有時(shí)候不需要重新生成圖像,只需要獲取坐標(biāo)。又在界面上加了一個(gè) “僅查詢坐標(biāo),不生成圖片”的選項(xiàng)。如果勾選,就會(huì)跳過保存的步驟,以節(jié)省時(shí)間。
以上的過程,最終就是如下這個(gè)腳本程序,處理我近百張圖片也就3分多的樣子,手工的話又容易出錯(cuò)又慢,程序的優(yōu)勢(shì)就這樣體現(xiàn)出來了。
以后要修改、調(diào)整,只要修改psd文檔,再用腳本重新生成 就很快完成工作。兩個(gè)多小時(shí)的編寫調(diào)試還是值得的 。
#target photoshop app.bringToFront(); res ="dialog { \ text:'找茬數(shù)據(jù)專用',\ group: Group{orientation: 'column',alignChildren:'left',\ folderO:Group{ orientation: 'row', \ b: Button {text:'待處理文件夾', properties:{name:'open'} ,helpTip:'選擇您需要處理的文件所在的文件夾'},\ s: EditText { text:'', preferredSize: [360, 20] },\ },\ folderS:Group{ orientation: 'row', \ b: Button {text:'輸出圖像至', properties:{name:'save'} ,helpTip:'選擇您處理好的文件要保存至的文件夾'},\ s: EditText { text:'', preferredSize: [360, 20] },\ },\ meng:Group{ orientation: 'row', \ c:Checkbox { text:' 啟用黑色蒙版'} ,\ s: StaticText { text:'| 蒙版收縮量(單位px):' }, \ e: EditText { text:'2', preferredSize: [20, 18]},\ },\ Quality: Group { orientation: 'row', \ c:Checkbox { text:' 僅查詢坐標(biāo),不生成圖片'} ,\ s: StaticText { text:'| 生成JPG的壓縮質(zhì)量:' }, \ d: DropDownList { alignment:'left', itemSize: [26,14] },\ }, \ gg: Group{orientation: 'column',alignChildren:'left' },\ timeline:Progressbar{bounds:[0,0,400,10] , minvalue:0,maxvalue:100}\ aa: Button { text:'START'}, \ }\ }"; var mengPoint=""; var mengColor =new SolidColor; mengColor.rgb.red =0; mengColor.rgb.green =0; mengColor.rgb.blue =0; win = new Window (res); win.myText = win.group.gg.add("edittext",[0,0,500,300],'~~~',{multiline:true, readonly:false}); for (i=0;i<13;i++){ //初始化jpeg質(zhì)量下拉 win.group.Quality.d.add("item", i ); } win.group.Quality.d.items[7].selected=true; function lyFoot() { // 選中最下層 var id553 = charIDToTypeID( "slct" ); var desc88 = new ActionDescriptor(); var id554 = charIDToTypeID( "null" ); var ref95 = new ActionReference(); var id555 = charIDToTypeID( "Lyr " ); var id556 = charIDToTypeID( "Ordn" ); var id557 = charIDToTypeID( "Back" ); ref95.putEnumerated( id555, id556, id557 ); desc88.putReference( id554, ref95 ); var id558 = charIDToTypeID( "MkVs" ); desc88.putBoolean( id558, false ); executeAction( id553, desc88, DialogModes.NO ); } function lyUp(){ //選中上一層 var id559 = charIDToTypeID( "slct" ); var desc89 = new ActionDescriptor(); var id560 = charIDToTypeID( "null" ); var ref96 = new ActionReference(); var id561 = charIDToTypeID( "Lyr " ); var id562 = charIDToTypeID( "Ordn" ); var id563 = charIDToTypeID( "Frwr" ); ref96.putEnumerated( id561, id562, id563 ); desc89.putReference( id560, ref96 ); var id564 = charIDToTypeID( "MkVs" ); desc89.putBoolean( id564, false ); executeAction( id559, desc89, DialogModes.NO ); } function openSm() { //打開智能對(duì)象 var id216 = stringIDToTypeID( "placedLayerEditContents" ); var desc43 = new ActionDescriptor(); executeAction( id216, desc43, DialogModes.NO ); } function lyHidden(){ //隱藏當(dāng)前圖層 var id217 = charIDToTypeID( "Hd " ); var desc44 = new ActionDescriptor(); var id218 = charIDToTypeID( "null" ); var list1 = new ActionList(); var ref24 = new ActionReference(); var id219 = charIDToTypeID( "Lyr " ); var id220 = charIDToTypeID( "Ordn" ); var id221 = charIDToTypeID( "Trgt" ); ref24.putEnumerated( id219, id220, id221 ); list1.putReference( ref24 ); desc44.putList( id218, list1 ); executeAction( id217, desc44, DialogModes.NO ); } function sm(name) { //保存結(jié)果圖像 lyFoot(); openSm(); var smDoc=app.activeDocument; if (win.group.meng.c.value) meng(smDoc); var saveFolder = win.group.folderS.s.text+"/"; saveOptions = new JPEGSaveOptions(); saveOptions.quality =win.group.Quality.d.selection.index;; //獲取jpg壓縮質(zhì)量 smDoc.saveAs(new File(saveFolder + name + "_1.jpg"),saveOptions, true,Extension.LOWERCASE); lyHidden(); smDoc.saveAs(new File(saveFolder + name + "_0.jpg"),saveOptions, true,Extension.LOWERCASE); smDoc.close(SaveOptions.DONOTSAVECHANGES); } function selectBounds(name,a,b,c,d) { //做選區(qū) app.activeDocument.selection.select([[a, b],[ a, d ], [c, d], [ c, b]],SelectionType.EXTEND); } function meng(smDoc) { //添加蒙版 nowPoint=mengPoint.split(","); for (var i=0;i<nowPoint.length-4;i+=4){ selectBounds(smDoc,nowPoint[i],nowPoint[i+1],nowPoint[i+2],nowPoint[i+3],) } // ==================================擴(kuò)展n像素 var id32 = charIDToTypeID( "Expn" ); var desc5 = new ActionDescriptor(); var id33 = charIDToTypeID( "By " ); var id34 = charIDToTypeID( "#Pxl" ); desc5.putUnitDouble( id33, id34, Number(win.group.meng.e.text) ); executeAction( id32, desc5, DialogModes.NO ); // ==================================反選 var id35 = charIDToTypeID( "Invs" ); executeAction( id35, undefined, DialogModes.NO ); // smDoc.selection.fill(mengColor); //填充蒙版色 } // 打開文件夾的操作 var folderOpen=win.group.folderO var folderSave=win.group.folderS folderOpen.b.onClick = function() { var defaultFolder = folderOpen.s.text; var testFolder = new Folder(defaultFolder); if (!testFolder.exists) { defaultFolder = "~"; } var selFolder = Folder.selectDialog("選擇待處理文件夾", defaultFolder); if ( selFolder != null ) { folderOpen.s.text = selFolder.fsName; folderOpen.s.helpTip = selFolder.fsName.toString(); } } folderSave.b.onClick = function() { var defaultFolder = folderSave.s.text; var testFolder = new Folder(defaultFolder); if (!testFolder.exists) { defaultFolder = "~"; } var selFolder = Folder.selectDialog("選擇要儲(chǔ)存至的文件夾", defaultFolder); if ( selFolder != null ) { folderSave.s.text = selFolder.fsName; folderSave.s.helpTip = selFolder.fsName.toString(); } } win.group.aa.onClick=function(){ var myText=""; var openFolder = Folder(win.group.folderO.s.text); var fileList = openFolder.getFiles() //獲取open文件夾下所有文件 win.group.timeline.value =0; var k=100/fileList.length; //調(diào)整文件順序,按數(shù)字大小排序 fileList.sort(function compare(a,b){return Number(a.name.substring(0, a.name.length-4))-Number(b.name.substring(0, b.name.length-4));}) // for (i=0;i<fileList.length;i++){ if (fileList[i] instanceof File && fileList[i].hidden == false){ //不處理隱藏文件 var docRef =open(fileList[i]); var nowName =docRef.name.substring(0, docRef.name.length-4); while (nowName.length<4) { nowName ="0"+nowName; } myText +=nowName+","; mengPoint=""; lyFoot(); for (j=1;j<docRef.layers.length;j++){ lyUp(); myText+=docRef.activeLayer.bounds+","; mengPoint+=docRef.activeLayer.bounds+","; } if (!win.group.Quality.c.value) sm(nowName); docRef.close(SaveOptions.DONOTSAVECHANGES); myText +="\r\n"; } win.group.timeline.value =win.group.timeline.value+k; } var re = / px/g; //要替換的“ px” win.myText.text=myText.replace(re, ""); } ////////////// win.center(); win.show();
出處:藍(lán)色理想
責(zé)任編輯:bluehearts
上一頁 談PS動(dòng)作、腳本實(shí)際工作中的應(yīng)用 [2] 下一頁 談PS動(dòng)作、腳本實(shí)際工作中的應(yīng)用 [4]
◎進(jìn)入論壇Photoshop、Fireworks版塊參加討論,我還想發(fā)表評(píng)論。
|