Photoshop JSX创建SmartObject时如何保持原始像素尺寸不缩放
Photoshop JSX 画板图层转智能对象无损尺寸解决方案
问题原因
直接调用默认newPlacedLayer动作创建智能对象时,Photoshop会自动对画板内选中图层的坐标做文档级换算,嵌套智能对象的已有变换属性会被二次计算,最终导致生成的智能对象像素被压缩。你之前尝试的resize方法仅能修改图层的外层变换参数,无法干预转智能对象过程中的内部像素换算逻辑,因此无效。
可用解决方案
方案1:调整智能对象创建参数(轻量)
构造带尺寸参数的动作描述符,指定创建时宽高比例为100%,禁用自动缩放适配:
var desc = new ActionDescriptor(); var ref = new ActionReference(); ref.putClass(stringIDToTypeID("placedLayer")); desc.putReference(charIDToTypeID("null"), ref); // 强制指定宽高缩放比例为100% desc.putUnitDouble(charIDToTypeID("Wdth"), charIDToTypeID("Prc "), 100); desc.putUnitDouble(charIDToTypeID("Hght"), charIDToTypeID("Prc "), 100); // 锚点设为中心对齐 desc.putEnumerated(charIDToTypeID("Anch"), charIDToTypeID("Anch"), charIDToTypeID("MdcC")); executeAction(charIDToTypeID("Mk "), desc, DialogModes.NO);
方案2:临时文档中转(100%保证尺寸)
如果方案1仍存在偏差,通过和画板等尺寸的临时文档中转,完全规避坐标换算问题:
var srcDoc = app.activeDocument; // 提前选中目标画板的所有需要合并的图层 var selectLayers = srcDoc.activeLayers; var targetArtboard = selectLayers[0].parent; var abBounds = targetArtboard.bounds; var abW = abBounds[2] - abBounds[0]; var abH = abBounds[3] - abBounds[1]; // 复制选中图层 app.executeAction(charIDToTypeID("Cpy "), undefined, DialogModes.NO); // 创建和画板尺寸、分辨率完全一致的临时文档 var tempDoc = app.documents.add(abW, abH, srcDoc.resolution, "temp", NewDocumentMode.RGB, DocumentFill.TRANSPARENT); app.executeAction(charIDToTypeID("Pste"), undefined, DialogModes.NO); // 临时文档内全选图层转智能对象 tempDoc.selection.selectAllLayers(); executeAction(stringIDToTypeID("newPlacedLayer"), undefined, DialogModes.NO); // 复制生成的智能对象 tempDoc.activeLayer.copy(); tempDoc.close(SaveOptions.DONOTSAVECHANGES); // 粘贴回原文档并对齐到原画板位置 var newSO = srcDoc.paste(); newSO.translate(abBounds[0] - newSO.bounds[0], abBounds[1] - newSO.bounds[1]);
内容的提问来源于stack exchange,提问作者Dave Benjoya
相关产品推荐
相关产品推荐

