好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 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类型代替
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()函数直接用编辑器运行不了,猜测这个函数是对内存的操作,不知道是不是。谁能解释一下就好了,感觉那个作者写的脚本功能更好。 |
免费评分
-
查看全部评分
|