为了账号安全,请及时绑定邮箱和手机立即绑定

PS脚本篇--1.代码是什么,写代码干嘛?

标签:
Photoshop

最近挺迷茫,总感觉高不成低不就的,看源码或书的时候有些焦躁,好吧,也许又到瓶颈了…
先静一静吧,回想一开始学编程时,出发点之一是:想用脚本玩转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,敬请期待(或许没了也说不定)…

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
移动开发工程师
手记
粉丝
20
获赞与收藏
56

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消