求遍历Photoshop层组所有排列生成唯一PNG的JS/JSX脚本
适配Photoshop CS5的全排列图层组合导出JSX脚本
功能说明
- 自动遍历PSD所有顶层层组,按「每个层组仅选1个图层」的规则生成所有合法组合,完全无重复
- 无需提前手动隐藏图层,脚本运行时自动处理显隐逻辑
- 导出文件名携带所选图层名称,方便溯源,例如
组合_短发_白T恤_牛仔裤.png - 原生兼容Photoshop CS5版本
完整脚本代码
// 兼容Photoshop CS5 全排列图层组合导出脚本 app.activeDocument.suspendHistory("批量导出组合", "main()"); function main() { var doc = app.activeDocument; var topGroups = doc.layerSets; if (topGroups.length < 1) { alert("当前文档没有检测到顶层层组,请检查PSD结构"); return; } // 1. 预处理:收集每个层组的可选图层,同时隐藏所有图层 var groupLayers = []; for (var g = 0; g < topGroups.length; g++) { var group = topGroups[g]; group.visible = true; var validLayers = []; for (var l = 0; l < group.layers.length; l++) { var layer = group.layers[l]; layer.visible = false; // 跳过名称以下划线开头的图层,不需要可直接移除该判断 if (layer.name.indexOf("_") !== 0) { validLayers.push(layer); } } if (validLayers.length === 0) { alert("层组" + group.name + "没有有效可选图层,请检查"); return; } groupLayers.push(validLayers); } // 2. 生成所有组合的笛卡尔积 var allCombinations = cartesianProduct(groupLayers); var confirmRun = confirm("检测到共" + allCombinations.length + "个合法组合,是否开始导出?"); if (!confirmRun) return; // 3. 创建导出文件夹 var outputFolder = new Folder(doc.path + "/PNG"); if (!outputFolder.exists) outputFolder.create(); // 4. 遍历所有组合导出 var pngOptions = new PNGSaveOptions(); pngOptions.interlaced = false; for (var c = 0; c < allCombinations.length; c++) { var combination = allCombinations[c]; var fileNameParts = []; // 显示当前组合的图层 for (var i = 0; i < combination.length; i++) { var layer = combination[i]; layer.visible = true; fileNameParts.push(layer.name); } // 保存文件 var savePath = new File(outputFolder + "/组合_" + fileNameParts.join("_") + ".png"); doc.saveAs(savePath, pngOptions, true, Extension.LOWERCASE); // 隐藏当前组合的图层,为下一次组合做准备 for (var i = 0; i < combination.length; i++) { combination[i].visible = false; } } alert("导出完成,共导出" + allCombinations.length + "个PNG文件"); // 恢复文档初始状态 var idRvrt = charIDToTypeID("Rvrt"); executeAction(idRvrt, undefined, DialogModes.NO); } // 笛卡尔积生成函数,输入多组数组,返回所有排列组合 function cartesianProduct(arrays) { return arrays.reduce(function(a, b) { var result = []; a.forEach(function(x) { b.forEach(function(y) { result.push(x.concat([y])); }); }); return result; }, [[]]); }
使用方法
- 打开目标PSD文件,确保参与组合的所有部位都存放在顶层层组中,层组下直接放对应可选样式的图层(若需要支持嵌套层组可自行修改代码遍历逻辑)
- 将上述代码复制保存为后缀为
.jsx的文件 - 在Photoshop中依次点击「文件」→「脚本」→「浏览」,选择保存的JSX文件运行
- 弹出组合数量确认提示后点击确认,等待导出完成即可,导出的文件存放在PSD同目录的
PNG文件夹下
注意事项
- 总组合数为所有层组可选图层数量的乘积,组合数过大时运行时间较长,建议先小批量测试
- 若不需要过滤下划线开头的图层,删除对应判断条件即可
内容的提问来源于stack exchange,提问作者blackstallion
相关产品推荐
相关产品推荐

