最近挺迷茫,總感覺
高不成低不就
的,看原始碼或書的時候有些焦躁
,好吧,也許又到瓶頸了...
先靜一靜吧,回想一開始學程式設計時,出發點之一是:想用指令碼玩轉PhotoShop
,久而久之竟然忘記
了
現在一些主流語言
也都差不多接觸了,物件導向
的理解也挺深的,看到PS時,在想:換個心情唄!
環境
指令碼語言: JavaScript
IDE環境:Idea (隨意,記事本也可以)
PS版本:18.0.0
複製程式碼
一、指令碼的使用
1.HelloWolrd 走起
---->[Hello.js]-----------------
Alert("Hello World");
複製程式碼
2.自定義快捷鍵
二、從物件導向的角度來看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() //執行播放提示音效果:叮咚
複製程式碼
2.開啟的檔案的資訊:app.documents
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
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
var cFiles = app.recentFiles;
var msg = "";
for (var i = 0; i < cFiles.length; i++) {
msg += (i + 1) + ":" + cFiles[i].name + "\r\n";
}
alert(msg);
複製程式碼
5.當前啟用的文件物件:app.activeDocument
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)
}
複製程式碼
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);
}
}
複製程式碼
3.拷貝當前文件並開啟
var doc = app.activeDocument;//當前檔案物件
doc.duplicate(app.activeDocument.name + "-copy", 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("儲存完成")
複製程式碼
5.壓縮並儲存圖片(web)
直接儲存的png 有11.1M, web匯出的0.3k,雖然效果上有些失色,還是很有價值的。
//壓縮儲存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);
複製程式碼
四、一些簡單操作
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);
複製程式碼
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);
複製程式碼
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);
複製程式碼
4.獲取圖層尺寸
var layer = app.activeDocument.activeLayer;//活動圖層
alert(layer.bounds);
複製程式碼
5.當前啟用圖層:色彩平衡
var layer = app.activeDocument.activeLayer;//活動圖層
layer.adjustColorBalance([-39,-81,0], [-44,50,-52], [0,0,0], true);//陰影、中間調、高光
複製程式碼
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的本身是一個物件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 擁有很完善的GUI介面,我並不認為在設計方面指令碼能比設計師厲害
指令碼暫時感覺還挺雞肋,能用介面解決的為什麼非要寫程式碼?
程式碼的優勢在於高效,不怕累,精確,縝密,低費,抓住這幾點,指令碼應該還是有用武之地的
複製程式碼
總的來說,我們有待處理的問題,稱為
IN資料
, 經過處理完成後結果稱為OUT資料
程式碼最終目的是解決問題(轉化資料),最終絕大多數落實到人的感官,即OUT資料
被消費,從而產生價值
古時候畫師將一個
醜女(IN資料)
畫成美女(OUT資料)
,客戶看了很滿意,完成工作
現在PS將一個醜女(IN資料)
變成美女(OUT資料)
,客戶看了很滿意,完成工作。
兩者之間本質區別在於:解決問題的方式即對資料的處理方式Handle
存在差異。
程式碼高效,實用,易用,精確,縝密,低費決定了它的競爭力無與倫比。但同時它的晦澀使群眾望塵莫及
為什麼要寫程式碼?
--- 不寫程式碼你想幹哈? 想飛上天啊? 想和太陽肩並肩啊?能得了你還....
廢話一堆,得看且看,下一篇正式來詳細介紹相關API,敬請期待(或許沒了也說不定)...