PS腳本篇--1.代碼是什麼,寫代碼幹嗎?

最近挺迷茫,總感受高不成低不就的,看源碼或書的時候有些焦躁,好吧,也許又到瓶頸了...
先靜一靜吧,回想一開始學編程時,出發點之一是:想用腳本玩轉PhotoShop,長此以往居然忘記
如今一些主流語言也都差很少接觸了,面向對象的理解也挺深的,看到PS時,在想:換個心情唄!程序員

環境
腳本語言: JavaScript
IDE環境:Idea (隨意,記事本也能夠)
PS版本:18.0.0
複製代碼

1、腳本的使用

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


2.自定義快捷鍵


2、從面向對象的角度來看PhotoShop

0.對象:app

將整個app看作一個對象,它擁有着衆多的方法和屬性,以此能夠獲取信息和操做圖片
先來看一下app對象中的幾個對象,找點感受web

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);
複製代碼

3、文件操做相關

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);
複製代碼


4、一些簡單操做

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...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,敬請期待(或許沒了也說不定)...bash

相關文章
相關標籤/搜索