PhotoShop脚本之Action Descriptor

最近研究PS工具,发现部分API不能直接获取到的图层信息,如描边色值、渐变色值等是可以通过PhotoShop的内置对象——Action Descriptor获取的。

1、PhotoShop脚本简介

PhotoShop脚本主要是基于JavaScript语言,以及PhotoShop的语言ExtendScript。这里不做赘述。
想要学习ExtendScript的小伙伴可以看看此官方文档:
https://wwwimages2.adobe.com/content/dam/acom/en/devnet/photoshop/pdfs/photoshop-cc-javascript-ref-2015.pdf

2、语言

PhotoShop支持几种脚本语言,Mac平台有AppleScript,Windows平台有VBScript,以及两个平台都支持的JavaScript。在这里我用的就是JavaScript语言,文件后缀是.jsx。

3、工具

PhotoShop脚本可以用任何文本编辑来写,这里推荐使用Adobe的IDE,叫Adobe ExtendScript Tookit,其支持断点调试,还可以通过Data Browser窗口查看对象的属性和方法。

4、语法

PhotoShop获取信息的一种方式是使用ExtendScript在文本对象模型DOM(Document Object Model)中访问和修改PSD源文件中对象的属性,直观而方便,但不能实现所有的PS操作。
PhotoShop获取信息的另一种方式是通过使用动作代理(ActionManager)的方式,可以实现比DOM更多的操作,但貌似不支持AppleScript。

动作代理主要类有ActionDescriptor,ActionReference,ActionList。

ActionDescriptor相当于一个存储属性和值的字典,
ActionList是一个存储相同属性的值的数组,
ActionReference存储一个action的引用

5、使用Action Descriptor

使用ActionManager看起来比使用ExtendScript要复杂许多,但好在Adobe有个监听Action的插件,下载地址:
Windows:http://download.adobe.com/pub/adobe/photoshop/win/13.x/Win_Scripting_Plug-In.zip
Mac:https://link.csdn.net/?target=http%3A%2F%2Fdownload.adobe.com%2Fpub%2Fadobe%2Fphotoshop%2Fmac%2F13.x%2FScripting_Plug_In_Release.dmg

下载解压后将ScriptListener.8li拷贝到Adobe Photoshop/Plug-ins/目录下即可。

重开PS,操作将会被记录在桌面的ScriptingListenerJS.log和ScriptingListenerVB.log中

切记不用时把该插件移除,需要时再复制到Plug-ins目录下,以免撑爆磁盘以及影响PS操作性能。

6、示例

这里举一个例子,获取文本图层的Outline色值
首先,下载安装好Adobe监听Action的插件,然后打开PS,新建一个空白文档,并新建一个文本层,输入文本:测试,选中文本图层
测试图

然后打开桌面的ScriptingListenerJS.log文本文档,把里面的内容删除并保存。
在PS中双击文本图层为其添加描边效果,然后打开ScriptingListenerJS.log
然后看到其操作代码:

通过查阅官方文档可以得知其对应的事件名,文档链接:https://wwwimages2.adobe.com/content/dam/acom/en/devnet/photoshop/pdfs/photoshop_scriptref_js.pdf

然后通过使用ExtendScript中的方法app. charIDToTypeID(charID)以及app.typeIDToStringID(id),可以得到对应Action的名字分别为(顺序由上到下)color,red,grain,blue,frameFX和layerEffects

然后获取选中图层的ActionDescriptor,使用前记得把文本图层设置为选中状态:

function getActiveLayerDescriptor()
{
	var ref = new ActionReference();
	ref.putEnumerated(char2Type("Lyr "), char2Type("Ordn"), char2Type("Trgt"));
	return executeActionGet(ref);
}

然后判断是否存在刚才所说的节点,其中顺序需要反过来,由下到上
先在当前图层的ActionDescriptor查找名为layerEffects的子节点,若存在则判断在layerEffects的ActionDescriptor中是否存在frameFX节点,以此类推,直到找到color节点下的三个Double类型的变量,用ActionDescriptor.getDouble方法,分别获取red,grain,blue的值

7、完整代码:

function getID(str)
{
    return app.stringIDToTypeID( str );
}

function getActiveLayerDescriptor()
{
	var ref = new ActionReference();
	ref.putEnumerated(char2Type("Lyr "), char2Type("Ordn"), char2Type("Trgt"));
	return executeActionGet(ref);
}

function descToColorList( colorDesc )
{
    return rgbTxt = [roundColor(colorDesc.getDouble(1382293536)),
					roundColor(colorDesc.getDouble(1198681632)),
					roundColor(colorDesc.getDouble(1114382368))];
}

function changeToHex(rgbTxt)
{
	var value = "";
	for(var i = 0, len = rgbTxt.length; i < len; i++)
	{
		var string = rgbTxt[i].toString(16);
		if(string.length < 2)
		{
			string = "0" + string;
		}
		value += string;
	}
	return value;
}

function roundColor(x) 
{
    x = Math.round(x);
    return (x > 255) ? 255 : x;
}

var currentDesc = getActiveLayerDescriptor();

var layerEffectsID = getID( "layerEffects" );
if(currentDesc.hasKey(layerEffectsID))
{
	var layerEffectsDesc = currentDesc.getObjectValue(layerEffectsID);
	var frameFXID = getID("frameFX");
	if(layerEffectsDesc.hasKey(frameFXID)){
		var frameFXDesc = layerEffectsDesc.getObjectValue(frameFXID);
		var colorID = getID("color");
		if(frameFXDesc.hasKey(colorID) && frameFXDesc.getBoolean(getID("enabled")))
		{
			var colorDesc = frameFXDesc.getObjectValue(colorID);
			var rgbTxt = descToColorList(colorDesc);
			var rgbHexTxt = changeToHex(rgbTxt);
			alert(rgbHexTxt);
		}
	}
}
 【为什么购买本课程?】1、学会Photoshop脚本,可以大幅提高您的工作效率、摆脱大量重复设计任务的束缚;2、扩展Photoshop的功能:天气预报、to-do设计任务管理、中文加拼音、图层文字中英互译、每日一句英语、OCR智能识别图片上的文字内容、 为上万影片批量生成九宫格预览图、为数百个视频自动添加内容不同的片头、自动获取图片的主题颜色、快速生成不限数量并且不重复的漂亮卡通头像、给Photoshop添加猜数字、贪吃蛇游戏等等;3、利用人工智能技术:在Photoshop中识别图片中指定颜色的物体、进行面部识别;4、掌握99%Photoshop设计师不曾接触的技能,打造自己的职场护城河!5、重要的是:只有我们这里提供系统、全面、易学的Photoshop脚本教程,只此一家,别无选择!  【Photoshop脚本是什么?】* Photoshop神秘和强大的一项秘技!* 它可以允许您以代码的方式来操作文档、美化图像、处理图层、控制通道、编辑选区、使用滤镜等等,就像在Photoshop界面上操作一样。* 与PhotoShop动作(Action)相比,PhotoShop脚本更强大、更智能、更富有逻辑判断功能。* PhotoShop脚本主要用于重复性的任务或用于制作非常复杂的特殊效果。 【学会Photoshop脚本,可以做什么?】* 一键给n个图片批量添加水印;* 一键将n个图片批量生成指定尺寸的缩略图;* 一键将PSD网页设计稿的各功能区域,批量输出为Web所用格式;* 一键生成iOS、Andriod应用和游戏必需的十几种尺寸的图标;* 一键将n个小图拼合为一张大图,并输出各小图在大图中的坐标信息;* 甚至开发一款运行在Photoshop上的趣味游戏!我们向您保证,学习PhotoShop脚本所花费的时间,可以在完成几项重复性的复杂任务时得到补偿。快来学习Photoshop脚本吧!  【课程的特点】1、创新的教学模式:手把手教您Photoshop自动化技术,一看就懂,一学就会;2、贴心的操作提示:让您的眼睛始终处于操作的焦点位置,不用再满屏找光标;3、语言简洁精练:瞄准问题的核心所在,减少对思维的干扰,并节省您宝贵的时间;4、视频短小精悍:即方便于您的学习和记忆,也方便日后对功能的检索;5、课程源码素材:购买课程之后,进入最后一章的最后一节的课件列表,下载课程源码素材。 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值