如何编写Photoshop脚本获取栅格化倾斜形状的边角坐标?
问题分析与解决方案
你的代码核心问题是使用了Layer.bounds属性,这个属性返回的是图层的轴对齐边界矩形——无论图层内的形状是否倾斜、变形,它都会生成一个与画布坐标轴完全平行的矩形框,所以拿到的四个点是这个大框的边角,而非倾斜形状本身的实际边角。
要获取栅格化图层中形状的真实边角,需要通过提取形状的轮廓路径来实现,具体步骤和代码如下:
实现思路
- 将栅格化图层的非透明区域转换为选区(选区对应形状的范围)
- 将选区转换为路径,路径的锚点就是形状的轮廓顶点
- 筛选路径中的角点(排除平滑锚点),得到形状的真实边角坐标
修正后的代码
var doc = app.activeDocument; var selectedLayer = doc.activeLayer; // 检查是否为栅格化图层(NORMAL类型)且可见 if (selectedLayer.kind === LayerKind.NORMAL && selectedLayer.visible) { try { // 1. 创建图层内容的选区(仅非透明区域) selectedLayer.createSelection(0, true, SelectionType.REPLACE, 0); // 2. 将选区转换为路径 var tempPath = doc.paths.add(); // 3. 提取路径中的角点坐标 var cornerPoints = []; for (var i = 0; i < tempPath.subPathItems.length; i++) { var subPath = tempPath.subPathItems[i]; for (var j = 0; j < subPath.pathPoints.length; j++) { var point = subPath.pathPoints[j]; // 只保留角点(排除平滑/贝塞尔锚点) if (point.kind === PathPointKind.CORNERPOINT) { cornerPoints.push([point.anchor[0].value, point.anchor[1].value]); } } } // 4. 输出结果 if (cornerPoints.length > 0) { var resultText = "形状边角坐标:\n"; cornerPoints.forEach(function(point, index) { resultText += "边角" + (index + 1) + ": " + point[0] + ", " + point[1] + "\n"; }); alert(resultText); } else { alert("未检测到形状边角"); } // 5. 删除临时路径,避免污染文档 tempPath.remove(); } catch (e) { alert("处理出错:" + e.message); // 出错时清理临时路径 if (typeof tempPath !== 'undefined') tempPath.remove(); } } else { alert("请选择可见的栅格化图层"); }
关键说明
createSelection():仅选中图层的非透明像素区域,确保选区完全匹配形状范围PathPointKind.CORNERPOINT:筛选路径中的角点,排除平滑锚点(这类锚点是曲线的控制点,不是形状的边角)- 临时路径清理:处理完成后删除生成的路径,不影响原文档内容
内容的提问来源于stack exchange,提问作者devton3s
相关产品推荐
相关产品推荐

