如何检测边界矩形相同的两个选区的实际大小差异?
如何区分边界矩形相同但实际范围不同的Photoshop选区?
当两个选区的app.activeDocument.selection.bounds返回相同值,但实际选区范围不同时,可以通过以下两种方法区分它们的实际大小:
方法一:统计选区内的像素数量
这种方法通过将选区存入临时Alpha通道,统计通道中白色像素(代表选区范围)的数量,直接反映选区的实际像素覆盖面积,适合处理包含羽化、半透明的选区。
示例代码(JavaScript):
function getSelectionPixelCount() { const doc = app.activeDocument; // 创建临时Alpha通道 const tempChannel = doc.channels.add(); // 将选区存储到临时通道 doc.selection.store(tempChannel); // 获取通道像素数据 const channelData = tempChannel.pixelData; let pixelCount = 0; // 遍历统计白色像素(值为255)的数量 for (let i = 0; i < channelData.length; i++) { if (channelData[i] === 255) pixelCount++; } // 删除临时通道 tempChannel.remove(); return pixelCount; } // 使用示例 const actualSize = getSelectionPixelCount(); alert(`选区实际覆盖像素数:${actualSize}`);
方法二:计算选区路径的面积
如果选区是矢量形状类的,可以将选区转换为工作路径,用鞋带公式计算路径围成的面积,精度更高且速度更快,适合无羽化的规则/不规则矢量选区。
示例代码(JavaScript):
function getSelectionPathArea() { const doc = app.activeDocument; // 将选区转换为工作路径(容差可根据需求调整) doc.selection.makeWorkPath(0.5); const workPath = doc.paths[doc.paths.length - 1]; let totalArea = 0; // 遍历所有子路径计算面积 for (const subPath of workPath.subPathItems) { const points = subPath.pathPoints; const pointCount = points.length; if (pointCount < 3) continue; // 至少3个点才能构成闭合区域 let subArea = 0; // 应用鞋带公式计算子路径面积 for (let i = 0; i < pointCount; i++) { const p1 = points[i].anchor; const p2 = points[(i + 1) % pointCount].anchor; subArea += (p1[0] * p2[1]) - (p1[1] * p2[0]); } totalArea += Math.abs(subArea) / 2; } // 删除临时工作路径 workPath.remove(); return totalArea; } // 使用示例 const pathArea = getSelectionPathArea(); alert(`选区路径面积:${pathArea} 平方像素`);
方法对比
- 像素统计法:适用于所有类型选区(包括羽化选区),但大文档下遍历像素会稍慢。
- 路径面积法:仅适用于可转换为路径的矢量类选区,计算速度快、精度高。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

