You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Photoshop脚本如何获取用户裁剪/选区操作后的偏移信息

问题

当我使用DialogModes.ALL创建裁剪区域时,如何在Photoshop脚本中获取用户手动完成裁剪/选区操作后的偏移信息?我应当在代码的哪个位置插入函数,才能捕获用户手动完成裁剪操作后的偏移信息?

初始代码如下:

var idCrop = charIDToTypeID( "Crop" );
var desc22 = new ActionDescriptor();
var idT = charIDToTypeID( "T   " );
    var desc23 = new ActionDescriptor();
    var idTop = charIDToTypeID( "Top " );
    var idPxl = charIDToTypeID( "#Pxl" );
    desc23.putUnitDouble( idTop, idPxl, 0.000000 );
    var idLeft = charIDToTypeID( "Left" );
    var idPxl = charIDToTypeID( "#Pxl" );
    desc23.putUnitDouble( idLeft, idPxl, 66.000000 );
    var idBtom = charIDToTypeID( "Btom" );
    var idPxl = charIDToTypeID( "#Pxl" );
    desc23.putUnitDouble( idBtom, idPxl, 1536.000000 );
    var idRght = charIDToTypeID( "Rght" );
    var idPxl = charIDToTypeID( "#Pxl" );
    desc23.putUnitDouble( idRght, idPxl, 1602.000000 );
var idRctn = charIDToTypeID( "Rctn" );
desc22.putObject( idT, idRctn, desc23 );
var idAngl = charIDToTypeID( "Angl" );
var idAng = charIDToTypeID( "#Ang" );
desc22.putUnitDouble( idAngl, idAng, 0.000000 );
var idDlt = charIDToTypeID( "Dlt " );
desc22.putBoolean( idDlt, false );
var idcropAspectRatioModeKey = stringIDToTypeID( "cropAspectRatioModeKey" );
var idcropAspectRatioModeClass = stringIDToTypeID( "cropAspectRatioModeClass" );
var idtargetSize = stringIDToTypeID( "targetSize" );
desc22.putEnumerated( idcropAspectRatioModeKey, idcropAspectRatioModeClass, idtargetSize );
var idWdth = charIDToTypeID( "Wdth" );
var idPxl = charIDToTypeID( "#Pxl" );
desc22.putUnitDouble( idWdth, idPxl, 800.000000 );
var idHght = charIDToTypeID( "Hght" );
var idPxl = charIDToTypeID( "#Pxl" );
desc22.putUnitDouble( idHght, idPxl, 800.000000 );
var idRslt = charIDToTypeID( "Rslt" );
var idRsl = charIDToTypeID( "#Rsl" );
desc22.putUnitDouble( idRslt, idRsl, 0.000000 );
executeAction( idCrop, desc22, DialogModes.ALL );
解答
  • 插入位置:所有捕获裁剪结果的逻辑,必须写在executeAction( idCrop, desc22, DialogModes.ALL )这行代码的后面。
    executeAction是阻塞调用,传入DialogModes.ALL时脚本会暂停在这一行,等用户完成裁剪交互(点击确认/取消)后才会继续执行后续代码,逻辑写在这行前面只能拿到你预设的初始裁剪参数,拿不到用户手动调整后的最终值。
  • 异常处理要求:必须给executeAction加try...catch包裹。如果用户在裁剪弹窗点击取消,executeAction会直接抛出错误,不加捕获的话整个脚本会直接中断,后续逻辑无法运行。
  • 参数获取方法:executeAction执行成功后会返回一个ActionDescriptor对象,里面直接包含用户调整后的所有裁剪参数(裁剪矩形的四边偏移、旋转角度等),不需要额外读取文档属性计算。

修改后的可运行示例:

var idCrop = charIDToTypeID( "Crop" );
var desc22 = new ActionDescriptor();
var idT = charIDToTypeID( "T   " );
    var desc23 = new ActionDescriptor();
    var idTop = charIDToTypeID( "Top " );
    var idPxl = charIDToTypeID( "#Pxl" );
    desc23.putUnitDouble( idTop, idPxl, 0.000000 );
    var idLeft = charIDToTypeID( "Left" );
    var idPxl = charIDToTypeID( "#Pxl" );
    desc23.putUnitDouble( idLeft, idPxl, 66.000000 );
    var idBtom = charIDToTypeID( "Btom" );
    var idPxl = charIDToTypeID( "#Pxl" );
    desc23.putUnitDouble( idBtom, idPxl, 1536.000000 );
    var idRght = charIDToTypeID( "Rght" );
    var idPxl = charIDToTypeID( "#Pxl" );
    desc23.putUnitDouble( idRght, idPxl, 1602.000000 );
var idRctn = charIDToTypeID( "Rctn" );
desc22.putObject( idT, idRctn, desc23 );
var idAngl = charIDToTypeID( "Angl" );
var idAng = charIDToTypeID( "#Ang" );
desc22.putUnitDouble( idAngl, idAng, 0.000000 );
var idDlt = charIDToTypeID( "Dlt " );
desc22.putBoolean( idDlt, false );
var idcropAspectRatioModeKey = stringIDToTypeID( "cropAspectRatioModeKey" );
var idcropAspectRatioModeClass = stringIDToTypeID( "cropAspectRatioModeClass" );
var idtargetSize = stringIDToTypeID( "targetSize" );
desc22.putEnumerated( idcropAspectRatioModeKey, idcropAspectRatioModeClass, idtargetSize );
var idWdth = charIDToTypeID( "Wdth" );
var idPxl = charIDToTypeID( "#Pxl" );
desc22.putUnitDouble( idWdth, idPxl, 800.000000 );
var idHght = charIDToTypeID( "Hght" );
var idPxl = charIDToTypeID( "#Pxl" );
desc22.putUnitDouble( idHght, idPxl, 800.000000 );
var idRslt = charIDToTypeID( "Rslt" );
var idRsl = charIDToTypeID( "#Rsl" );
desc22.putUnitDouble( idRslt, idRsl, 0.000000 );

var cropResult = null;
try {
    // 阻塞等待用户操作,接收返回的裁剪结果
    cropResult = executeAction( idCrop, desc22, DialogModes.ALL );
} catch (e) {
    // 用户取消裁剪的分支
    alert("已取消裁剪操作");
}

// 提取最终偏移参数
if (cropResult) {
    var rectDesc = cropResult.getObjectValue(charIDToTypeID("T   "));
    var finalTop = rectDesc.getUnitDoubleValue(charIDToTypeID("Top "));
    var finalLeft = rectDesc.getUnitDoubleValue(charIDToTypeID("Left"));
    var finalBottom = rectDesc.getUnitDoubleValue(charIDToTypeID("Btom"));
    var finalRight = rectDesc.getUnitDoubleValue(charIDToTypeID("Rght"));
    var finalAngle = cropResult.getUnitDoubleValue(charIDToTypeID("Angl"));
    
    // 后续自定义逻辑,比如打印偏移值
    alert("最终裁剪偏移:\n上偏移:"+finalTop+"px\n左偏移:"+finalLeft+"px\n下边界:"+finalBottom+"px\n右边界:"+finalRight+"px\n旋转角度:"+finalAngle+"°");
}

如果你把裁剪参数里的idDlt设为true(即裁剪时删除隐藏像素),也可以在executeAction执行完成后直接读取当前文档的bounds属性,得到的偏移结果和从返回描述符中提取的完全一致。

内容的提问来源于stack exchange,提问作者Matoyo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 01:49:16