背景
帮个朋友做一个简单的自动小工具,小工具的作用是将目录指定目录下的图片按照一定步骤制作并保存出来。
制图步骤包括: 平移、缩放对齐、描边、缩放、选择边框(魔术棒选择)、创建专色通道、保存
实现
思路
-
为了方便使用,打算做成 PS 的一个插件,在菜单项中激活
-
因为之前完全没搞过 PS 的插件,所以想着怎么简单怎么来
制作
-
经过简单的了解,发现 PS 插件制作支持 javascript/action script/html/C++ 几种方式,而自己只熟悉 C++,简单 js,另外两个都仅限于看懂。另外 js 插件可以根据 PS 自带的例子来学习,所以就选择 js 啦
-
选好方案,自然是找资料学习和例子/代码片段来参考(魔改)了,这方面有几个方面:a. 自带的脚本插件;b. 官方文档; c. 搜索引擎
-
码 bug 和难点
大部分功能都挺简单的,可以通过已有的例子或 API 文档找到实现,其中画了我比较多时间的是魔术棒选择这一步,因为没找到现成的 API,最后靠搜索引擎(关键词: MagicWand)找到个例子,通过自己调试达到效果。代码贴一下备忘:
this.MagicWandSelect = function(x, y, t, a, c, s) {
if (arguments.length < 2) {
return;
}
if (undefined == t) { // 容差
t = 32;
}
if (undefined == a) { // 抗锯齿
a = true;
}
if (undefined == c) { // 连续采样
c = false;
}
if (undefined == s) { // 所有图层
s = false;
}
// 传进来的参数是厘米, 转成毫米
var unitX = new UnitValue(x, "cm");
var unitY = new UnitValue(y, "cm");
x = unitX.as("mm");
y = unitY.as("mm");
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putProperty(charIDToTypeID("Chnl"), charIDToTypeID("fsel"));
desc.putReference(charIDToTypeID("null"), ref);
var posDesc = new ActionDescriptor();
var idUnitX = charIDToTypeID("#Mlm"); // millimeters
posDesc.putUnitDouble(charIDToTypeID("Hrzn"), idUnitX, x);
var idUnitY = charIDToTypeID("#Mlm"); // millimeters
posDesc.putUnitDouble(charIDToTypeID("Vrtc"), idUnitY, y);
desc.putObject(charIDToTypeID("T "), charIDToTypeID("Pnt "), posDesc);
desc.putInteger(charIDToTypeID("Tlrn"), t);
desc.putBoolean(charIDToTypeID("Mrgd"), s);
// if (!c) {
// 没搞清楚参数意义之前不要加这个, 加了选择不正确
// desc.putBoolean(charIDToTypeID("Cntg"), false);
// }
desc.putBoolean(charIDToTypeID("AntA"), a);
executeAction(charIDToTypeID("setd"), desc, DialogModes.NO);
}
最后工具效果图
1.png经验总结
- 搞清楚各个参数/子项的意义很重要(被 c 参数坑了很久)
- 需要注意 API 生效的前提条件(单位没对也花了我不少时间)
参考
- PS 安装目录下的插件 Photoshop CS6\Presets\Scripts
- PS API Photoshop-CS6-JavaScript-Ref.pdf
- PS UI 相关 API JavaScript Tools Guide CS5.pdf
- PS 官方文档列表 - 根据版本和工具选自己的文档
- PS 脚本调试器
- 搜索引擎 & 一堆网页
网友评论