kftianji 发表于 2019-2-13 17:02

PS脚本小记(3)

本帖最后由 kftianji 于 2019-3-24 14:40 编辑

参考(在度娘搜):
Adobe CEP 扩展开发教程 「 6 」 Photoshop 中文脚本参考
Adobe CEP 扩展开发教程 「 5 」 Photoshop ExtendScript 入门
Adobe CEP 扩展开发教程 「 附录 · 1 」PhotoShop ExtendScript
常数表脚本解析photoshop文本属性
=============




ps脚本的最后一记。这次的内容在ps里形态变了,用DOM的方式做描边效果,找了好久,未找到简单的描边方式。
-----------
名词说明(各人理解):
API:      exe程序的接口-----exe程序是封装好的代码合集,通过API(接口)调试或链接内核。
DOM:      文档对象模型(Document Object Model)这里类似API,API是函数形式接口,这里的DOM是常量形式接口(各人理解)。
-----------
具体操作:
首先要给ps装一个插件(动作记录器,应该是Adobe自己出的),附件里的ScriptListener.8li放在ps目录下的Plug-ins这个文件夹中,重开ps
这时桌面会多出两个文档,和,这也两个文档的功能是一样的,记录你在ps里的每步操作。
(不用记录功能时,记得把Plug-ins文件夹下的ScriptListener.8li删掉)

ScriptingListenerJS.log=JS(javascript)语言内容
ScriptingListenerVB.log=VB语言内容

这里用ScriptingListenerJS.log的内容做描边说明
第一步:在ps中添加文字(文字内容任意)
第二步:打开和文档,删去全部内容。保存关闭这两个文档。
第三步:ps中,点击菜单栏[图层]---[图层样式]---[描边],弹出设置里,设置:【大小】2像素,【位置】外部,【填充类型】颜色,【颜色】(色彩板选个和字体颜色有反差的色彩,以便查看效果),
【混合模式】默认的是正常【不透明度】默认100%,点击确定添加效果。
第四步:打开ScriptingListenerJS.log将看到下边的代码(最好复制出来全部内容,保存到自己的文档里),先不要看这段代码,先看后边写的代码注释。
// =======================================================
var idsetd = charIDToTypeID( "setd" );
    var desc2 = new ActionDescriptor();
    var idnull = charIDToTypeID( "null" );
      var ref1 = new ActionReference();
      var idPrpr = charIDToTypeID( "Prpr" );
      var idLefx = charIDToTypeID( "Lefx" );
      ref1.putProperty( idPrpr, idLefx );
      var idLyr = charIDToTypeID( "Lyr " );
      var idOrdn = charIDToTypeID( "Ordn" );
      var idTrgt = charIDToTypeID( "Trgt" );
      ref1.putEnumerated( idLyr, idOrdn, idTrgt );
    desc2.putReference( idnull, ref1 );
    var idT = charIDToTypeID( "T   " );
      var desc3 = new ActionDescriptor();
      var idScl = charIDToTypeID( "Scl " );
      var idPrc = charIDToTypeID( "#Prc" );
      desc3.putUnitDouble( idScl, idPrc, 100.000000 );
      var idFrFX = charIDToTypeID( "FrFX" );
            var desc4 = new ActionDescriptor();
            var idenab = charIDToTypeID( "enab" );
            desc4.putBoolean( idenab, true );
            var idStyl = charIDToTypeID( "Styl" );
            var idFStl = charIDToTypeID( "FStl" );
            var idOutF = charIDToTypeID( "OutF" );
            desc4.putEnumerated( idStyl, idFStl, idOutF );
            var idPntT = charIDToTypeID( "PntT" );
            var idFrFl = charIDToTypeID( "FrFl" );
            var idSClr = charIDToTypeID( "SClr" );
            desc4.putEnumerated( idPntT, idFrFl, idSClr );
            var idMd = charIDToTypeID( "Md" );
            var idBlnM = charIDToTypeID( "BlnM" );
            var idNrml = charIDToTypeID( "Nrml" );
            desc4.putEnumerated( idMd, idBlnM, idNrml );
            var idOpct = charIDToTypeID( "Opct" );
            var idPrc = charIDToTypeID( "#Prc" );
            desc4.putUnitDouble( idOpct, idPrc, 100.000000 );
            var idSz = charIDToTypeID( "Sz" );
            var idPxl = charIDToTypeID( "#Pxl" );
            desc4.putUnitDouble( idSz, idPxl, 2.000000 );
            var idClr = charIDToTypeID( "Clr " );
                var desc5 = new ActionDescriptor();
                var idRd = charIDToTypeID( "Rd" );
                desc5.putDouble( idRd, 255.000000 );
                var idGrn = charIDToTypeID( "Grn " );
                desc5.putDouble( idGrn, 255.000000 );
                var idBl = charIDToTypeID( "Bl" );
                desc5.putDouble( idBl, 255.000000 );
            var idRGBC = charIDToTypeID( "RGBC" );
            desc4.putObject( idClr, idRGBC, desc5 );
      var idFrFX = charIDToTypeID( "FrFX" );
      desc3.putObject( idFrFX, idFrFX, desc4 );
    var idLefx = charIDToTypeID( "Lefx" );
    desc2.putObject( idT, idLefx, desc3 );
executeAction( idsetd, desc2, DialogModes.NO );


----------------------------------------------


现在把代码写上没有用的注释:
(这是上边那段代码的注释,先到下边看说明,再对照这里的代码看,会容易理解一些)

// =======================================================
var idsetd = charIDToTypeID( "setd" )//设置

    var desc2 = new ActionDescriptor()//ActionDescriptor新动作
    var idnull = charIDToTypeID( "null" )//空值
   
      var ref1 = new ActionReference()//动作描述符
      var idPrpr = charIDToTypeID( "Prpr" )//属性
      var idLefx = charIDToTypeID( "Lefx" )//图层效果
      ref1.putProperty( idPrpr, idLefx )//添加ref1的属性
      
      var idLyr = charIDToTypeID( "Lyr " )//图层
      var idOrdn = charIDToTypeID( "Ordn" )//顺序
      var idTrgt = charIDToTypeID( "Trgt" )//目标枚举
      ref1.putEnumerated( idLyr, idOrdn, idTrgt )//
      desc2.putReference( idnull, ref1 )//添加desc2动作参数的键值
//------------------------------------------------------------------------------------------

      var idT = charIDToTypeID( "T   " )//to方向
      var desc3 = new ActionDescriptor()//
      var idScl = charIDToTypeID( "Scl " )//值型
      var idPrc = charIDToTypeID( "#Prc" )//百分比单位
      desc3.putUnitDouble( idScl, idPrc, 100.000000 )//添加desc3偶键值
      
      var idFrFX = charIDToTypeID( "FrFX" )//fx框架
            var desc4 = new ActionDescriptor()//
            var idenab = charIDToTypeID( "enab" )//启用
            desc4.putBoolean( idenab, true )//添加一个布尔值类型的键值
            
            var idStyl = charIDToTypeID( "Styl" )//风格
            var idFStl = charIDToTypeID( "FStl" )//框架样式
            var idOutF = charIDToTypeID( "OutF" )//外部框架
            desc4.putEnumerated( idStyl, idFStl, idOutF )//添加一个枚举键值
            
            var idPntT = charIDToTypeID( "PntT" )//上色类型
            var idFrFl = charIDToTypeID( "FrFl" )//框架填充
            var idSClr = charIDToTypeID( "SClr" )//纯色
            desc4.putEnumerated( idPntT, idFrFl, idSClr )//添加一个枚举键值
            
            var idMd = charIDToTypeID( "Md" )//方式
            var idBlnM = charIDToTypeID( "BlnM" )//混合方式
            var idNrml = charIDToTypeID( "Nrml" )//正常
            desc4.putEnumerated( idMd, idBlnM, idNrml )//添加一个枚举键值
            
            var idOpct = charIDToTypeID( "Opct" )//不透明度
            var idPrc = charIDToTypeID( "#Prc" )//百分比单位
            desc4.putUnitDouble( idOpct, idPrc, 100.000000 )//添加一个单位偶键值
            
            var idSz = charIDToTypeID( "Sz" )//大小
            var idPxl = charIDToTypeID( "#Pxl" )//px单位量
            desc4.putUnitDouble( idSz, idPxl, 5.000000 )//描边px

            var idClr = charIDToTypeID( "Clr " )//颜色
            
    /////////////////////////////////////////////                  
                var desc5 = new ActionDescriptor()//
                var idRd = charIDToTypeID( "Rd" )//红
                desc5.putDouble( idRd, 0.000000 )//
               
                var idGrn = charIDToTypeID( "Grn " )//绿
                desc5.putDouble( idGrn, 255.000000 )//
               
                var idBl = charIDToTypeID( "Bl" )//蓝
                desc5.putDouble( idBl, 0.000000 )//
//------------------------------------------------------------------------               
               
            var idRGBC = charIDToTypeID( "RGBC" )//RGB颜色
            desc4.putObject( idClr, idRGBC, desc5 )//添加一个对象类型的键值
            
      var idFrFX = charIDToTypeID( "FrFX" )//fx框架
      desc3.putObject( idFrFX, idFrFX, desc4 )//
      
    var idLefx = charIDToTypeID( "Lefx" )//图层效果
    desc2.putObject( idT, idLefx, desc3 )//添加desc2对象的键值
////////////////////////////////////////////////////   
executeAction( idsetd, desc2, DialogModes.NO )//执行动作代___理事件




代码内容关键说明:
代码 77 行:
executeAction( idsetd, desc2, DialogModes.NO )
    executeAction( 事件, 动作描述符, 对话框模式 ) 这个函数用于执行在ps中的一次操作。
    参数3可无,亦可以选下边这三种形态之一:
    DialogModes.ALL                弹出所有
    DialogModes.ERROR      只有弹出错误对话框
    DialogModes.NO                不弹出对话框   
   
代码04行:
var desc2 = new ActionDescriptor()
    executeAction( )函数的第二个必有参数,新建的一个 ‘动作描述’型 变量
    内容ActionDescriptor说明:
          动作描述
          动作描述 下辖很多功能,比如指定目标图层等。
          ActionDescriptor可以包含任意多个ActionReference()(代码07行)

代码07行:
var ref1 = new ActionReference()
    新建的一个 ‘动作参考’型 变量
    内容ActionReference说明:
         动作参考
         动作参考在ActionDescriptor动作描述中可以无
         动作参考 同样下辖了很多功能,如果 动作描述 指定了一个图层,那么 动作参考 就可以在 动作描述中把这个图层的属性给设置一下(图层的属性包含:文字图层,图层透明等)
代码01行:
var idsetd = charIDToTypeID( "setd" )//设置
    把ps内部常量指定给变量idsetd
    内容charIDToTypeID( )说明:
         内部常量转换
         charIDToTypeID这个字是由          三部分组成
         无论ActionDescriptor下辖的功能函数还是ActionReference下辖的功能函数,所要用的参数都是都是TypeID的值,
         因为TypeID的值是一长串数字,看代码时不好理解,所以就用charID类型或者StringID类型代替

         a是charID类型,b是StringID类,真正要用的是1936028772这个数
         ID之间可以互相转换:
                                          
                                             charIDToTypeID( )
                                          StringIDToTypeID( )
                                          charIDToStringID( )
                                          其他请自行尝试


三种核心变量说完了,那么长的代码看着都累,接着把上边的代码精简一下:
还是先看说明吧!


strokeTxt(5,255,255,255)

function cTt(value){return charIDToTypeID(value)}

function getLayer(){
   
var ref = new ActionReference()
//ref.putProperty( charIDToTypeID( "Prpr" ),charIDToTypeID( "Lefx" ) )//属性.图层效果,可无
ref.putEnumerated(cTt("Lyr "), cTt("Ordn"), cTt("Trgt"))//图层.顺序.枚举
return ref
}//确认当前图层

function strokeTxt(strokSize,colorR,colorG,colorB){
var desc2 = new ActionDescriptor()//ActionDescriptor新动作
      desc2.putReference( cTt( "null" ), getLayer() )//添加desc2动作参数的键值
   
var desc4 = new ActionDescriptor()//
      desc4.putBoolean( cTt( "enab" ), true )//启用"layerFXVisible"图层效果
      desc4.putEnumerated( cTt( "Styl" ), cTt( "FStl" ), cTt( "OutF" ) )////格式.框架.外部
      desc4.putUnitDouble( cTt( "Sz" ),cTt( "#Pxl" ), strokSize )//[描边]大小.px单位
          var desc5 = new ActionDescriptor()
                desc5.putDouble( cTt( "Rd" ), colorR )
                desc5.putDouble( cTt( "Grn " ),colorG )
                desc5.putDouble( cTt( "Bl" ), colorB )
      desc4.putObject( cTt( "Clr " ), cTt( "RGBC" ), desc5 )//添加一个对象类型的键值
   var desc3 = new ActionDescriptor()//
         desc3.putUnitDouble( cTt( "Scl " ),cTt( "#Prc" ), 100.000000 )//值单位.百分比
         desc3.putObject( cTt( "FrFX" ), cTt( "FrFX" ), desc4 )//fx框架
   desc2.putObject( cTt( "T   " ), cTt( "Lefx" ), desc3 )//到.图层效果
////////////////////////////////////////////////////   
executeAction(cTt( "setd" ),desc2)//设置.执行动作代{过}{滤}理事件
}



说明:
strokeTxt(5,255,255,255)
strokeTxt是描边行为的动作代(和谐)理;参1:描边大小;参2:颜色_红;参3:绿;参4:蓝;

cTt(value)
cTt为了简化charIDToTypeID,省打多少字!

getLayer()
getLayer这个函数,几乎在所有动作里都不可少,独立出来了。

-----------
附件:
https://www.lanzouj.com/i34tufg

包含:
ps部分常量.xlsx(常量说明)
ScriptListener.8li(插件_动作记录器)
Photoshop JavaScript Ref.pdf(脚本开发文档(英文))
文件夹:JavaScript(脚本例子)
文件夹:xtools(不知道是什么,想删就删)
--------------------
结语:
总的来说,JS写的脚本所实现的功能比较少,用DOM写功能会更广泛。自己写DOM脚本的话,要先看Adobe出的脚本说明文档,全英文的海量数据完全看不懂也觉的太长,还不如做成汉化字典。
现在找到最好的做法是。用ScriptingListenerJS.log记录的动作,编辑简化后直接使用。
动作记录器:ScriptListener.8li,应该是Adobe自己出的。

在csdn网里看《常数表脚本解析photoshop文本属性》,其中的getVal()函数直接用编辑器运行不了,猜测这个函数是对内存的操作,不知道是不是。谁能解释一下就好了,感觉那个作者写的脚本功能更好。

0fifa 发表于 2019-2-13 17:11

ps跑脚本还需要用插件么?不是一直支持{:1_908:}

wubwu33 发表于 2019-2-13 17:23

这个有意思。一直梦想自己能够编个脚本让PS能自动执行较复杂一点的动作,可惜自己不会。要从哪里学起呢?以前能用BASIC编程。是不是要先熟悉VBA呀。

kftianji 发表于 2019-2-13 20:03

wubwu33 发表于 2019-2-13 17:23
这个有意思。一直梦想自己能够编个脚本让PS能自动执行较复杂一点的动作,可惜自己不会。要从哪里学起呢?以 ...

先看PS脚本小记(1)吧。javascript脚本语言,用很少一部分就行了,没啥内容。
需用啥就学啥,我这是要研究批量添加字幕的。

为海尔而战 发表于 2019-2-13 22:06

用代码跑ps,厉害!我一般记录动作。

梁梁59599 发表于 2019-5-16 08:49

非常感谢,太好了,真给力,找了好久的资料

梁梁59599 发表于 2019-5-20 19:28

已经私信您,爱币太少,只能发几条消息,望大神能解答困扰我许久的问题。

tanphotos 发表于 2020-3-11 23:20

楼主还更新能容吗
页: [1]
查看完整版本: PS脚本小记(3)