aardio 文档

aardio 范例: Photoshop COM 控制演示

import com;
import win.ui;
/*DSG{{*/
var winform = win.form(text="Photoshop COM 控制演示";right=549;bottom=349)
winform.add(
btnExecuteJS={cls="button";text="执行JS并获取文档名";left=32;top=24;right=224;bottom=72;z=1};
btnExtractSubject={cls="button";text="一键抠图 (选择主体)";left=240;top=24;right=432;bottom=72;z=2};
editLog={cls="edit";left=32;top=88;right=512;bottom=320;edge=1;multiline=1;vscroll=1;z=3}
);
/*}}*/

// 示例 1:基础的 JS 执行与传参
winform.btnExecuteJS.oncommand = function(id,event){

    // 先尝试获取已运行的 PS,获取不到再尝试启动新的
    var psApp = com.GetOrCreateObject("Photoshop.Application");
    if(!psApp) return winform.editLog.print("无法连接到 Photoshop,请确认已安装并正常运行。");

    //默认使用 VARIANT 类型数组,避免数组参数报错“不支持的 Variant 类型”
    com.SetPreferredArrayType(psApp,0xC/*_VT_VARIANT*/)

    if (psApp.Documents.Count == 0) {
        winform.editLog.print("当前 Photoshop 没有打开的文档。");
        return;
    }

    // 准备要执行的 ExtendScript (JavaScript) 代码
    var jsCode = /**
        function getDocInfo(prefix, suffix) {

            // 获取当前活动文档
            var doc = app.activeDocument;

            // 组合并返回字符串给 aardio
            return prefix + doc.name + suffix;
        }

        // 调用函数,arguments 会接收来自 aardio 传进来的数组
        getDocInfo(arguments[0], arguments[1]);
    **/

    /*
    调用 DoJavaScript,函数原型:
    psApp.DoJavaScript( JS代码 , 参数数组, 执行模式 ) 

    - 传参:你可以将 aardio 数组传递给第二个参数,在 JS 内部使用全局变量 arguments 来接收。
    - 返回值:JS 脚本最后执行的语句的值会返回给 aardio。
    - 执行模式:通常设为 1(正常执行)。
    */
    var result = psApp.DoJavaScript(jsCode, ["文档名称是:", "!"], 1/*Normal*/);

    /*
    在 aardio 中通过 COM 接口(Photoshop.Application)控制 Photoshop,
    最核心、最强大、也是最推荐的技巧就是借助 COM 接口执行 Photoshop 原生的 ExtendScript (JavaScript)。

    Photoshop 自身的 COM 属性和方法相对有限,
    但它的 DoJavaScript 方法却可以直接调用 Photoshop 丰富且强大的底层 DOM 和 Action Manager API(即动作代码)。
    */
    winform.editLog.print("JS 返回结果: ",result);

    // 直接调用 COM 属性或方法
    winform.editLog.print("COM 接口 返回结果: ",psApp.activeDocument.name)
}

// 示例 2:调用底层 ActionManager 代码实现“一键抠图”
winform.btnExtractSubject.oncommand = function(id,event){
    var psApp = com.GetOrCreateObject("Photoshop.Application");
    if(!psApp) winform.editLog.print("无法连接到 Photoshop,请确认已安装并正常运行。");
    com.SetPreferredArrayType(psApp,0xC/*_VT_VARIANT*/);

    if (psApp.Documents.Count == 0) {
        winform.editLog.print("请先在 PS 中打开一张带有人物或主体的图片。");
        return;
    }

    winform.editLog.print("正在调用 PS AI 识别主体,请稍候...");


    /*
    现代 Photoshop (CC 2018+) 提供了基于 AI 的“选择主体”功能。
    虽然没有直接的简单函数调用它,但我们可以通过执行 JS 封装的 Action Manager (底层动作) 脚本来实现一键自动抠图(选择主体 -> 复制到新图层)。
    下面这段 JS 通过底层的 executeAction 调用 PS 的“选择主体”功能,并 Ctrl+J 建立新图层
    */
    var jsCode = /**
        function autoExtract() {
            try {
                // 1. 调用“选择主体” (Select Subject)
                var idautoCutout = stringIDToTypeID( "autoCutout" );
                var desc = new ActionDescriptor();
                var idsampleAllLayers = stringIDToTypeID( "sampleAllLayers" );
                desc.putBoolean( idsampleAllLayers, false );
                executeAction( idautoCutout, desc, DialogModes.NO );

                // 2. 将选区内容复制到新图层 (等同于 Ctrl+J)
                var idCpTL = charIDToTypeID( "CpTL" );
                executeAction( idCpTL, undefined, DialogModes.NO );

                return "抠图成功!已生成透明背景的新图层。";
            } catch(e) {
                return "操作失败或没有找到主体: " + e.message;
            }
        }
        autoExtract();
    **/

    try{
        var result = psApp.DoJavaScript(jsCode, null, 1);
        winform.editLog.print(result);
    }
    catch(e){
        winform.editLog.print("执行失败,请确保使用的 PS 版本支持该功能 (CC 2018 及以上)。");
    }
}

winform.show();
win.loopMessage();

Markdown 格式