国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 辦公 > Photoshop > 正文

PS動(dòng)作、腳本實(shí)際工作中的應(yīng)用

2024-08-21 23:17:48
字體:
供稿:網(wǎng)友

  前面photoshop教程介紹了photoshop入門:動(dòng)作的安裝使用實(shí)例 和 photoshop入門:動(dòng)作(action)安裝和使用。

  最近在做一些無聊游戲,具體就不多說了,談實(shí)際碰到的兩個(gè)例子:

  由于常常有人抱怨寫的東西看不懂,所以廢話多了點(diǎn),講的內(nèi)容也比較粗淺,還望熟手見諒

  一、自己的麻將牌變對(duì)家的牌

  做好一副麻將牌,需要把它上下顛倒過來。


  如果用垂直or水平反轉(zhuǎn),很明顯字都是反的。直接旋轉(zhuǎn)順序不符合程序要求,且透視不對(duì),于是要一張張牌單獨(dú)處理。

  由于是重復(fù)操作,且沒有什么變數(shù),于是我們采用動(dòng)作處理:
  做選區(qū),ctrl+t旋轉(zhuǎn)180度,移動(dòng)選區(qū)到下一個(gè)位置(1張牌的距離)






  本來這個(gè)動(dòng)作很簡單,但是實(shí)際測(cè)試發(fā)現(xiàn):
  ctrl+t自由變換后,移動(dòng)選區(qū)會(huì)帶著圖像走,不能單純移動(dòng)


  想辦法解決:自由變換后,先取消選區(qū)(ctrl+d),再恢復(fù)上一個(gè)選區(qū)(ctrl+shift+d)。這樣,在移動(dòng)選區(qū),就不會(huì)帶走圖像了。

  于是我們錄制動(dòng)作,一遍遍的執(zhí)行,只要第一次選區(qū)準(zhǔn)確、移動(dòng)準(zhǔn)確,就萬事大吉了

|||

二、找茬游戲中腳本的應(yīng)用

項(xiàng)目要求:制作一大批圖片。每兩幅一組,兩幅之間有十處不同,記錄每處不同的矩形區(qū)域坐標(biāo)。

首先是制作圖片:其實(shí)就是簡單的p圖,制造一些差異。
為了方便對(duì)比觀察,避免錯(cuò)漏,使用了cs3的智能對(duì)象的堆棧功能(new)。
感覺這樣比較方便比較,能在精確查看不同的同時(shí)ps圖片的內(nèi)容。

首先建立固定大小的文件,再把素材圖拉進(jìn)來,調(diào)整大小,然后ctrl+e合并到底層(合并是為了確保未來的智能對(duì)象大小和圖像大小一致),ctrl+j 新建一層。我們只ps 新建出來的這一層,下面不動(dòng)。
因?yàn)橛?0處差異,所以光靠切換可視對(duì)比~比較辛苦,且容易錯(cuò)漏,[差值]對(duì)比效果也差又累。
所以我們同時(shí)選中兩個(gè)圖層,右鍵-[轉(zhuǎn)換為智能對(duì)象],然后菜單-圖層-智能對(duì)象-堆棧模式-標(biāo)準(zhǔn)偏差

這時(shí)候我們就明顯看到兩層之間的差異了,
我們可以雙擊圖層面板的智能對(duì)象縮略圖,就可以展開進(jìn)入智能對(duì)象內(nèi)部,繼續(xù)編輯兩個(gè)圖層

我們?cè)谥悄軐?duì)象內(nèi)部編輯的時(shí)候,只要隨手ctrl+s 保存一下,就可以看到原圖(黑色那張)上的差異變化了。

圖像處理完后,然后就是獲得由差異區(qū)域的坐標(biāo):程序需要把差異區(qū)域作為一個(gè)個(gè)矩形,要得到每個(gè)區(qū)域左上角和右下角的坐標(biāo)。

最開始,想把所有區(qū)域拉出選區(qū),然后通過 cs3 的新增統(tǒng)計(jì)功能獲得詳細(xì)的選區(qū)數(shù)據(jù),結(jié)果~~
非常遺憾,統(tǒng)計(jì)可以同時(shí)獲得所有選區(qū)的周長、長寬、面積甚至密度~ 就是不給出具體的每一組坐標(biāo)(如下圖所示)

于是只有改變做法,這時(shí)候想到了腳本 里面的 selection.bounds 獲得選區(qū)坐標(biāo),
遺憾的發(fā)現(xiàn),似乎腳本里面沒有獲取多個(gè)區(qū)域選取數(shù)據(jù)的方法,只能獲得總選區(qū)的左上角+右下角坐標(biāo)
也就是說10個(gè)區(qū)域當(dāng)成一個(gè)大區(qū)域來看了。~

繼續(xù)改變方案,改用圖層,每個(gè)圖層只記錄一個(gè)區(qū)域,總可以了吧~~
因?yàn)橹暗慕?jīng)驗(yàn),確定圖層的范圍坐標(biāo)是可以在腳本里通過 artlayer.bounds 獲取的。
所以接下來要做的事情就是手動(dòng)建立一個(gè)個(gè)小矩形的圖層。

由于工作量巨大,不偷懶是不行的,所以錄制了一個(gè)動(dòng)作

可以看到,這個(gè)動(dòng)作錄制了3步:

  1. 新建圖層
  2. 填充選區(qū)
  3. 取消選區(qū)

而且這個(gè)動(dòng)作設(shè)置了快捷鍵 f12 (雙擊動(dòng)作名稱,就可以設(shè)置快捷鍵)

有了這個(gè)動(dòng)作,我只要拉出一個(gè)選區(qū),然后按一下 f12,就自動(dòng)新建一個(gè)圖層,并填充好。
這樣就方便腳本獲取每層的數(shù)據(jù)了。
完成后的文件結(jié)構(gòu)如下:

|||

上面是10層不同位置的矩形,最底層是一個(gè)智能對(duì)象(包含兩個(gè)圖層,上面一層為修改后的,下面一層為原圖)
文件格式ok,接下來就是腳本大顯身手的地方了。

接下來我們開始編寫腳本,為了通俗,這一步主要只是談?wù)勊悸?/strong>

首先測(cè)試單個(gè)文件,腳本大致需要執(zhí)行如下步驟:

  1. 移動(dòng)到最底層
  2. 向上移動(dòng)一層,利用 activelayer.bounds 記錄層范圍坐標(biāo),并把坐標(biāo)記錄下來
  3. 反復(fù)執(zhí)行第2步,直到最頂層
  4. 輸出記錄

有了以前一些腳本的經(jīng)驗(yàn),實(shí)現(xiàn)上面這個(gè)功能沒有碰到什么難度,很容易搞定。

然后就是批量處理了 ,該腳本已經(jīng)有完善的批量打開、保存處理模塊。局部copy后稍加修改,就讓我們的腳本實(shí)現(xiàn)了如下功能:

  1. 用戶選擇待處理文件夾
  2. 獲取該文件夾下所有文件
  3. 打開一個(gè)文件,獲取并記錄所有需要的坐標(biāo),關(guān)閉不保存
  4. 重復(fù)第3步,直至處理完所有文件
  5. 輸出記錄

測(cè)試成功后,想到:既然已經(jīng)動(dòng)用腳本獲取了所有坐標(biāo),索性把兩張不同的圖片也輸出保存好了。于是添加了一個(gè)保存位置選擇。
并對(duì)單個(gè)文件內(nèi)的操作作了修改:

  1. 移動(dòng)到最底層
  2. 打開最底層智能對(duì)象
  3. 另存智能對(duì)象為jpg文檔(xxx_1)
  4. 隱藏智能對(duì)象里的最上層,也就是我們修改過的那層
  5. 再次另存智能對(duì)象為jpg文檔(xxx_0)
  6. 不保存關(guān)閉智能對(duì)象(回到原文檔)
  7. 向上移動(dòng)一層,利用 activelayer.bounds 記錄層范圍坐標(biāo),并把坐標(biāo)記錄下來
  8. 反復(fù)執(zhí)行第7步,直到最頂層

這樣不但記錄了坐標(biāo)數(shù)據(jù),還順便把智能對(duì)象里面的兩個(gè)層都輸出為jpg圖像了。

后來,由于第二張圖片和第一張圖片很多相同的地方,導(dǎo)致游戲文件體積較大,所以想了一個(gè)解決辦法,就是把相同的部分用黑色擋住,只保留不同的地方,這樣jpg就小很多。也許是個(gè)笨辦法吧,畢竟不太清楚別人怎么做的,這里只是給大家說說思路罷了。

于是再次修改單個(gè)文件內(nèi)的操作部分

  1. 移動(dòng)到最底層
  2. 向上移動(dòng)一層,利用activelayer.bounds 記錄層范圍坐標(biāo),并把坐標(biāo)記錄下來
  3. 反復(fù)執(zhí)行第2步,直到最頂層
  4. 再次回到最底層
  5. 打開最底層智能對(duì)象
  6. 利用記錄的坐標(biāo),建立選區(qū)(增加模式),全部選區(qū)增添完后,反選
  7. 填充黑色(這時(shí)候是填充在智能對(duì)象內(nèi)部最上層上,也就是我們修改過的那層)
  8. 另存為智能對(duì)象為jpg文檔(xxx_1)
  9. 隱藏當(dāng)前圖層
  10. 再次另存智能對(duì)象為jpg文檔(xxx_0)
  11. 不保存關(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();

|||

在編寫腳本的時(shí)候,不能不提到的一個(gè)輔助工具就是“腳本偵聽程序”
這個(gè)東西就在 cs3 安裝目錄下面的“腳本指南/實(shí)用工具”里面(英文版在 scripting guide/utilities/)


如果把它拷貝到“增效工具/自動(dòng)”目錄下(英文版為 plug-ins/automate),再重新啟動(dòng)ps。你的ps就相當(dāng)于安裝了一個(gè)“竊聽器”,會(huì)把你所有的操作步驟像錄制動(dòng)作一樣錄制為腳本。只要你有可記錄的動(dòng)作,它就在桌面生成“scriptinglistenerjs”、“scriptinglistenervb” 兩個(gè)文本文件。其實(shí)就是 javascript 和 vbscript 兩種規(guī)則記錄的動(dòng)作。

雖然不像手工書寫的代碼易于理解和修改,但是很多直接操作的步驟都可以拷貝來用。

比如說上面的 “移動(dòng)到最底層”“選中上一層”“隱藏當(dāng)前層”“打開智能對(duì)象”“擴(kuò)展n像素”“反選”等等動(dòng)作就是通過腳本偵聽錄制下來 直接拷貝過來的。
再結(jié)合自己的編寫的其他邏輯語句,很容易寫出你想要的東西。

最后,希望有點(diǎn)編程基礎(chǔ)又有興趣的朋友,
在處理重復(fù)、量大或者經(jīng)常碰到的工作的時(shí)候,多多挖掘ps的潛力。

其實(shí)寫一個(gè)簡單的針對(duì)性腳本或者動(dòng)作 并不是很難哦 ^_^

提供jsx源文件+兩個(gè)psd文檔,分本是 f14和殲10,有興趣的朋友可以試試看,注意cs3以上

鑒于實(shí)踐表明

同樣顯示效果下 [另存為jpg] 比 [保存為web所用格式-jpg] 文件體積要大很多,所以最后替換了保存函數(shù)。 把saveas,換成了exportdocument.,具體如下:

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 exportoptionssaveforweb();
    saveoptions.format =savedocumenttype.jpeg;
    saveoptions.quality=win.group.quality.e.text;
    smdoc.exportdocument(new file(savefolder + name + "_1.jpg"),exporttype.saveforweb,saveoptions);   
    lyhidden();
    smdoc.exportdocument(new file(savefolder + name + "_0.jpg"),exporttype.saveforweb,saveoptions);
    smdoc.close(saveoptions.donotsavechanges);
}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 建平县| 汪清县| 郧西县| 沙洋县| 灵山县| 丰城市| 华坪县| 巨鹿县| 大石桥市| 贵州省| 韩城市| 灵台县| 界首市| 自治县| 彝良县| 宜州市| 临邑县| 辰溪县| 泸定县| 磐安县| 同心县| 泸州市| 镇康县| 虹口区| 炎陵县| 锡林浩特市| 桂平市| 尼玛县| 淅川县| 湟源县| 同德县| 丰都县| 镇远县| 宜春市| 大丰市| 城固县| 铜山县| 沙洋县| 五华县| 延长县| 三江|