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
相关产品推荐
相关产品推荐

