PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?

張風捷特烈發表於2019-04-29

最近挺迷茫,總感覺高不成低不就的,看原始碼或書的時候有些焦躁,好吧,也許又到瓶頸了...
先靜一靜吧,回想一開始學程式設計時,出發點之一是:想用指令碼玩轉PhotoShop,久而久之竟然忘記
現在一些主流語言也都差不多接觸了,物件導向的理解也挺深的,看到PS時,在想:換個心情唄!

環境
指令碼語言: JavaScript
IDE環境:Idea (隨意,記事本也可以)
PS版本:18.0.0
複製程式碼

一、指令碼的使用

1.HelloWolrd 走起
---->[Hello.js]-----------------
Alert("Hello World");
複製程式碼

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?


2.自定義快捷鍵

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?


二、從物件導向的角度來看PhotoShop

0.物件:app

將整個app看做一個物件,它擁有著眾多的方法和屬性,以此可以獲取資訊和操作圖片
先來看一下app物件中的幾個物件,找點感覺

app {//整個PS軟體物件
    name,//軟體名稱
    version,//軟體版本
    documents:{},//開啟的檔案的資訊
    fonts:{}//系統字型
    recentFiles:{},//所有的開啟文件物件(陣列)
    activeDocument:{}//當前啟用的文件物件
}
複製程式碼

1.獲取名稱和版本號+操作提示音:app.beep()
---->[info.js]-----------------
var msg = app.name + "\r\n 版本:" + app.version;
alert(msg);
app.beep() //執行播放提示音效果:叮咚
複製程式碼

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?


2.開啟的檔案的資訊:app.documents

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?

var docs = app.documents;
var msg = "";

for (var i = 0; i < docs.length; i++) {
    msg +=
        "名稱:" + docs[i].name + "\r\n" +
        "寬/畫素:" + docs[i].width + "\r\n" +
        "高/畫素:" + docs[i].height + "\r\n";
}
alert(msg);
複製程式碼

3.列出字型:app.fonts

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?

var fonts = app.fonts;
var msg = "";

for (var i = 0; i < fonts.length; i++) {
    msg += "序號:" + (i + 1) + "  字型:" + fonts[i].name + "\r\n";
}
alert(msg);
複製程式碼

4.最近開啟的檔案:app.recentFiles

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?

var cFiles = app.recentFiles;
var msg = "";
for (var i = 0; i < cFiles.length; i++) {
    msg += (i + 1) + ":" + cFiles[i].name + "\r\n";
}
alert(msg);
複製程式碼

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?


5.當前啟用的文件物件:app.activeDocument

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?

var doc = app.activeDocument;
msg = "名稱:" + doc.name + "\r\n" +
    "寬/畫素:" + doc.width + "\r\n" +
    "高/畫素:" + doc.height + "\r\n";
alert(msg);
複製程式碼

三、檔案操作相關

1.開啟圖片:"open(File)"
var img = File("J:\\Java\\Android\\TolyGithub\\TolyTest\\toly_test\\src\\main\\res\\mipmap-xxhdpi\\bg_10.jpg");
var ok = confirm("開啟圖片?");
if (ok) {
    open(img)
}
複製程式碼

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?


2.開啟資料夾下所有圖片
var imgFolder = File("J:\\Java\\Android\\TolyGithub\\TolyTest\\toly_test\\src\\main\\res\\mipmap-xxhdpi");
var files = imgFolder.getFiles();
for (var i = 0; i <files.length; i++) {
    var file = files[i];
    if (file instanceof File) {
        open(file);
    }
}
複製程式碼

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?


3.拷貝當前文件並開啟
var doc = app.activeDocument;//當前檔案物件
doc.duplicate(app.activeDocument.name + "-copy", 1);//拷貝當前文件並開啟
複製程式碼

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?


4.檔案另存為:app.activeDocument.saveAs
var doc = app.activeDocument;//當前檔案物件
var outPath = new File("G:\\Photo\\龍少.png");
var options = PNGSaveOptions;//儲存png模式
var asCopy = true;//副本方式儲存
var extensionType = Extension.LOWERCASE;//擴充名小寫
doc.saveAs(outPath, options, asCopy, extensionType);
alert("儲存完成")
複製程式碼

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?


5.壓縮並儲存圖片(web)

直接儲存的png 有11.1M, web匯出的0.3k,雖然效果上有些失色,還是很有價值的。

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?

//壓縮儲存gif
var doc = app.activeDocument;//當前檔案物件
var path = new File("G:\\Photo\\龍少.gif");
var eop = new ExportOptionsSaveForWeb();//web圖片匯出配置
eop.transparecy = false;//是否正常透明度
eop.includeProfile = true;//是否包含內建顏色配置檔案
eop.lossy = 0;//有失真壓縮程度
eop.colors = 256;//色彩量
eop.colorReduction = ColorReductionType.SELECTIVE;////減低顏色深度演算法:可選擇
eop.formate = SaveDocumentType.COMPUSERVEGIF;//匯出格式FIF
eop.ditherAmount = 0;//畫素抖動值
eop.dither = Dither.NOISE;//雜色
eop.palette = Palette.LOCALADAPTIVE;//區域性(隨樣性)
doc.exportDocument(path, ExportType.SAVEFORWEB, eop);
alert("儲存完成:" + path);

//壓縮儲存jpeg
var doc = app.activeDocument;//當前檔案物件
var filePath = new File("G:\\Photo\\龍少.jpeg");
var eop = new ExportOptionsSaveForWeb();//web圖片匯出配置
eop.quality = 60;//圖片質量
doc.exportDocument(filePath, ExportType.SAVEFORWEB, eop);
alert("儲存完成:" + filePath);

//壓縮儲存png
var doc = app.activeDocument;//當前檔案物件
var filePath = new File("G:\\Photo\\龍少-compressed.png");
var eop = new ExportOptionsSaveForWeb();//web圖片匯出配置
eop.PNG8 = true;//png 8彩
doc.exportDocument(filePath, ExportType.SAVEFORWEB, eop);
alert("儲存完成:" + filePath);
複製程式碼

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?


四、一些簡單操作

1.建立新檔案
//建立新檔案
var width = 1080;//寬
var height = 1920;//高
var resolution=72;//解析度
var fileName="phone";//名稱
var mode = NewDocumentMode.RGB;//色彩模式
var fillColor = DocumentFill.TRANSPARENT;//背景填充顏色
var pixelAspectRatio=1;//畫素比率
app.documents.add(width, height, resolution, fileName, mode, fillColor, pixelAspectRatio);
複製程式碼

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?


2.新增文字圖層
//建立文字圖層
var doc = app.documents.add(500, 200);
var artLayer = doc.artLayers.add();
artLayer.kind = LayerKind.TEXT;

var textItem = artLayer.textItem;//文字條目
textItem.contents = "張風捷特烈";//文字內容
textItem.size = 40;
artLayer.translate(0, 100);
複製程式碼

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?


3.獲取當前檔案的所有圖層
//獲取圖層物件
var layers = app.activeDocument.artLayers;
var msg = "";
for (var i = 0; i < layers.length; i++) {
    var layer = layers[i];
    msg += i + "--圖層名稱:" + layer.name + "\r\n";
}
alert(msg);
複製程式碼

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?


4.獲取圖層尺寸
var layer = app.activeDocument.activeLayer;//活動圖層
alert(layer.bounds);
複製程式碼

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?


5.當前啟用圖層:色彩平衡
var layer = app.activeDocument.activeLayer;//活動圖層
layer.adjustColorBalance([-39,-81,0], [-44,50,-52], [0,0,0], true);//陰影、中間調、高光
複製程式碼

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?


6.前景色和背景色的修改
var ok = confirm("是否隨機設定前景色和背景色?");
if (ok) {
    //前景色
    app.foregroundColor.rgb.red = Math.random() * 255;
    app.foregroundColor.rgb.green = Math.random() * 255;
    app.foregroundColor.rgb.blue = Math.random() * 255;
    //背景色
    app.backgroundColor.rgb.red = Math.random() * 255;
    app.backgroundColor.rgb.green = Math.random() * 255;
    app.backgroundColor.rgb.blue = Math.random() * 255;
}
複製程式碼

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?

引子就到這裡,本篇只有意識到PS的本身是一個物件app就行了,就像瀏覽器的window物件
下面進入正題:


開始散扯-----------------------閒人請進--------------------------------

1.程式碼是什麼?

不知道有沒有人真正認真考慮過這個問題,還是跟我一樣,上來就是用Java跟著敲HelloWorld
然後輸出了HelloWorld,老師得意的說:看到沒,這就是你們的第一行程式碼。之後就一路api...

這個問題對於程式設計師來說就像在問什麼是呼吸一樣,那呼吸是什麼?
|-- 呼吸,是指機體與外界環境之間氣體交換的過程

程式碼是什麼?
|-- 程式碼就是程式設計師用開發工具所支援的語言寫出來的原始檔,
|-- 是一組由字元、符號或訊號碼元以離散形式表示資訊的明確的規則體系

程式碼是兩個字,當然也是翻譯出來的(code),我覺得這翻譯的恰到好處
代: 替代物,也就是說此物並非真身
碼:這個字在中國是一個計量的工具,是一個代表數目的符號

整個過程就像一箇中國人在德國餐廳,說一句中文:"請給我一杯水",
然後經過空氣粒子翻譯後,改變空氣分子震動方式,傳到德國人的耳中:"Geben Sie mir ein Glas Wasser."
然後德國人給你一杯水喝一樣。中國人並不需要會德文,他也能發出指令讓對方執行。

程式碼就是:"請給我一杯水",代替的是:"Geben Sie mir ein Glas Wasser."
"空氣翻譯粒子"就是生產程式碼所在的語言環境,我們俗稱:"IDE"

[1].程式碼不是給計算機看的,程式碼是給人看的
[2].計算機/虛擬機器可以識別並執行程式碼編譯後的二進位制檔案
[3].程式的執行功能需要正確的編譯
複製程式碼

2.為什麼要寫程式碼
這個問題對於程式設計師來說就像在問人為什麼要呼吸一樣,毫無意義?那人為什麼要呼吸呢?
|-- A : 不呼吸就憋死了唄
|-- B : 呼吸作用可以使內糖類、脂類和蛋白質等有機物的氧化分解,產生ATP,提供生命活動需要的能量
|-- C : 呼吸作用:
        第一階段 C6H12O6(葡萄糖)=4[[H]{(還原氫)+2C3H403(丙酮酸)+2ATP
        第二階段 2C3H4O3(丙酮酸)+6H2O(水)===20[H](還原氫)+6CO2(二氧化碳)+2ATP
        第三階段 24[H](還原氫)+6O2(氧氣)=12H2O(水)+大量能量34ATP
        總反應式 C6H12O6+6H2O+6O2 --酶-→ 6CO2+12H2O+大量能量(38ATP)

程式碼是什麼?
|-- A : 不寫程式碼就餓死了
|-- B : 寫程式碼可以使腦中的想法、架構、功能等思維現實化成產品,產生金錢,提供生命活動需要的物質
|-- C : 寫程式碼:
        第一階段:衣帶漸寬終不悔,為伊消得人憔悴 = 千百虐 + 如初戀
        第二階段:獨上高樓,望斷天涯路
        第二階段:驀然回首,那人卻在燈火闌珊處 ---> 登頂封神
        
程式碼是一種手段,能讓計算機執行人的意志。
其實不寫程式碼也可以,有能力你可以直接敲0101,就像那個中國人直接說:"Geben Sie mir ein Glas Wasser."  

為了更好的讓計算機執行人的意志,我們從問題的解決方案由:
一條條的指令的執行來完成任務(程式導向)
到將問題抽象成類,讓物件之間相互作用來完成任務(物件導向)

這就相當於出現了板磚,然後就能搭架構,建房子,房子又有各自的風格
還要內部的執行機制合理,然後大型的程式不但可以平穩的執行,還能擴充新功能  

像PhotoShop這樣的大型軟體,提供了一個GUI的操作介面,也就是 程式碼---> 無碼  
設計師不需要會敲程式碼,也可以使用,而且他們的美學和設計專業的知識更與PhotoShop相配:

程式碼 --> 編譯器 --> 二進位制檔案   -->計算機    依靠編譯器產生二進位制檔案,計算機可執行它本不認識的程式碼 
程式碼 --> 計算機 --> 圖形介面     --> 設計師   依靠計算機產生圖形介面,設計師可執行它本不認識的程式碼
程式碼 --> 計算機 --> PhotoShop物件--> 指令碼     依靠計算機產生PhotoShop物件,指令碼可執行它本不認識的程式碼
複製程式碼

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?

PS指令碼篇--1.程式碼是什麼,寫程式碼幹嘛?

PS 擁有很完善的GUI介面,我並不認為在設計方面指令碼能比設計師厲害
指令碼暫時感覺還挺雞肋,能用介面解決的為什麼非要寫程式碼?
程式碼的優勢在於高效,不怕累,精確,縝密,低費,抓住這幾點,指令碼應該還是有用武之地的
複製程式碼

總的來說,我們有待處理的問題,稱為IN資料, 經過處理完成後結果稱為OUT資料
程式碼最終目的是解決問題(轉化資料),最終絕大多數落實到人的感官,即OUT資料被消費,從而產生價值

古時候畫師將一個醜女(IN資料)畫成美女(OUT資料),客戶看了很滿意,完成工作
現在PS將一個醜女(IN資料)變成美女(OUT資料),客戶看了很滿意,完成工作。
兩者之間本質區別在於:解決問題的方式即對資料的處理方式Handle存在差異。
程式碼高效,實用,易用,精確,縝密,低費決定了它的競爭力無與倫比。但同時它的晦澀使群眾望塵莫及

為什麼要寫程式碼?
--- 不寫程式碼你想幹哈? 想飛上天啊? 想和太陽肩並肩啊?能得了你還....
廢話一堆,得看且看,下一篇正式來詳細介紹相關API,敬請期待(或許沒了也說不定)...

相關文章