吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5375|回复: 7
收起左侧

[其他转载] PS脚本小记(3)

  [复制链接]
kftianji 发表于 2019-2-13 17:02
本帖最后由 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
这时桌面会多出两个文档,[ScriptingListenerJS.log]和[ScriptingListenerVB.log],这也两个文档的功能是一样的,记录你在ps里的每步操作。
(不用记录功能时,记得把Plug-ins文件夹下的ScriptListener.8li删掉)

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

这里用ScriptingListenerJS.log的内容做描边说明
第一步:在ps中添加文字(文字内容任意)
第二步:打开[ScriptingListenerJS.log]和[ScriptingListenerVB.log]文档,删去全部内容。保存关闭这两个文档。
第三步: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 );


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


现在把代码写上没有用的注释:
(这是上边那段代码的注释,先到下边看说明,再对照这里的代码看,会容易理解一些)
[JavaScript] 纯文本查看 复制代码
// =======================================================
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这个字是由[charID]     [To]       [TypeID]三部分组成
           无论ActionDescriptor下辖的功能函数还是ActionReference下辖的功能函数,所要用的参数都是都是TypeID的值,
           因为TypeID的值是一长串数字,看代码时不好理解,所以就用charID类型或者StringID类型代替
adf234.JPG
           a是charID类型,b是StringID类,真正要用的是1936028772这个数
           ID之间可以互相转换:
                                            
                                             charIDToTypeID( )
                                            StringIDToTypeID( )
                                            charIDToStringID( )
                                            其他请自行尝试


三种核心变量说完了,那么长的代码看着都累,接着把上边的代码精简一下:
还是先看说明吧!
[JavaScript] 纯文本查看 复制代码

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()函数直接用编辑器运行不了,猜测这个函数是对内存的操作,不知道是不是。谁能解释一下就好了,感觉那个作者写的脚本功能更好。

免费评分

参与人数 2吾爱币 +6 热心值 +2 收起 理由
vxlley + 1 + 1 谢谢@Thanks!
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

0fifa 发表于 2019-2-13 17:11
ps跑脚本还需要用插件么?不是一直支持
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
楼主还更新能容吗
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 07:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表