如何批量替换PSD文件中3D Layer的Base Color纹理图片
解决Photoshop JSX批量替换3D图层Base Color纹理问题
问题概述
我有一个包含3D图层的Photoshop .psd 文件,该3D图层包含Base Color纹理选项。我需要批量替换Base Color纹理使用的图片文件,但现有JSX脚本无法定位到对应的材质,需要完善脚本实现需求。
现有脚本片段:
function processSingleImage(psdFile, imageFile, outputFolder, folderName) { var doc = app.open(psdFile); try { // 找到第一个3D图层 var threeDLayer = getFirst3DLayer(doc); $.writeln (threeDLayer.name) if (!threeDLayer) { alert("未找到3D图层!"); return; } // 获取3D图层的材质(Material) var material = threeDLayer.materials; if (!material) { alert("3D图层没有材质!"); return; } // 查找基础颜色纹理(Base Color Texture) var baseColorTexture = getBaseColorTexture(material); if (!baseColorTexture) { alert("未找到基础颜色纹理!"); return; } replace3D(imageFile, doc); // 保存结果 saveOutput(doc, psdFile, outputFolder, folderName, imageFile.name); } finally { if(doc && doc != app.activeDocument) { doc.close(SaveOptions.DONOTSAVECHANGES); } } } function getFirst3DLayer(doc) { for (var i = 0; i < doc.layers.length; i++) { var layer = doc.layers[i]; // 方法1:直接检查3D属性(适用于较新版本PS) if (layer.kind == LayerKind.LAYER3D) { return layer; } } return null; }
完善后的完整脚本
以下是补充关键函数后的完整脚本,实现Base Color纹理的批量替换:
function processSingleImage(psdFile, imageFile, outputFolder, folderName) { var doc = app.open(psdFile); try { // 找到第一个3D图层 var threeDLayer = getFirst3DLayer(doc); if (!threeDLayer) { alert("未找到3D图层!"); return; } $.writeln("找到3D图层:" + threeDLayer.name); // 获取3D图层的材质数组(一个3D图层可能包含多个材质) var materials = threeDLayer.materials; if (!materials || materials.length === 0) { alert("3D图层没有材质!"); return; } // 查找基础颜色纹理(Base Color Texture) var baseColorTexture = getBaseColorTexture(materials); if (!baseColorTexture) { alert("未找到基础颜色纹理!"); return; } // 替换纹理文件 replaceBaseColorTexture(baseColorTexture, imageFile); // 保存结果 saveOutput(doc, psdFile, outputFolder, folderName, imageFile.name); } finally { if(doc && doc != app.activeDocument) { doc.close(SaveOptions.DONOTSAVECHANGES); } } } function getFirst3DLayer(doc) { for (var i = 0; i < doc.layers.length; i++) { var layer = doc.layers[i]; // 检查是否为3D图层 if (layer.kind == LayerKind.LAYER3D) { return layer; } } return null; } // 遍历所有材质,定位Base Color纹理 function getBaseColorTexture(materials) { for (var i = 0; i < materials.length; i++) { var material = materials[i]; var textures = material.textures; for (var j = 0; j < textures.length; j++) { var texture = textures[j]; // 通过纹理类型定位Base Color(兼容中英文界面) if (texture.type === TextureType.BASECOLOR) { $.writeln("找到Base Color纹理:" + texture.name); return texture; } // 兼容部分旧版本或中文界面的备选方案(根据名称匹配) // if (texture.name === "基础颜色" || texture.name === "Base Color") { // return texture; // } } } return null; } // 替换Base Color纹理文件 function replaceBaseColorTexture(texture, imageFile) { try { // 使用绝对路径替换纹理 texture.replace(new File(imageFile)); $.writeln("已替换纹理为:" + imageFile); } catch (e) { alert("替换纹理失败:" + e.message); } } // 保存输出文件(需根据需求完善保存逻辑) function saveOutput(doc, psdFile, outputFolder, folderName, imageName) { var savePath = new Folder(outputFolder + "/" + folderName); if (!savePath.exists) savePath.create(); // 示例:保存为PSD格式 var saveFile = new File(savePath + "/" + imageName.replace(/\.[^/.]+$/, "") + "_modified.psd"); doc.saveAs(saveFile, new PhotoshopSaveOptions(), true, Extension.LOWERCASE); $.writeln("已保存文件:" + saveFile.fullName); } // ------------------- 批量处理示例 ------------------- function batchProcess() { var psdTemplate = new File("/path/to/your/template.psd"); // 替换为你的PSD模板路径 var imageFolder = new Folder("/path/to/your/images"); // 替换为存放替换图片的文件夹 var outputRoot = new Folder("/path/to/output"); // 替换为输出文件夹 if (!psdTemplate.exists || !imageFolder.exists) { alert("模板文件或图片文件夹不存在!"); return; } var imageFiles = imageFolder.getFiles(function(file) { // 过滤支持的图片格式 return file.type.match(/(jpg|jpeg|png|tif|tiff)$/i); }); if (imageFiles.length === 0) { alert("图片文件夹中没有可处理的图片!"); return; } // 遍历所有图片进行替换 for (var i = 0; i < imageFiles.length; i++) { var imgFile = imageFiles[i]; processSingleImage(psdTemplate, imgFile, outputRoot.fsName, "output"); } alert("批量处理完成!"); } // 执行批量处理 batchProcess();
关键说明
- 材质遍历逻辑:
threeDLayer.materials是材质数组,需要遍历所有材质来查找目标纹理,避免遗漏。 - 纹理定位:使用
TextureType.BASECOLOR枚举类型定位Base Color纹理,这是最可靠的方式,不受界面语言影响;如果遇到旧版本PS不支持枚举,可启用注释的名称匹配逻辑。 - 纹理替换:调用
texture.replace()方法传入新图片的文件对象,确保使用绝对路径避免路径错误。 - 批量处理:示例中包含
batchProcess函数,可根据实际需求修改模板路径、图片文件夹和输出路径。
内容的提问来源于stack exchange,提问作者user24297021
相关产品推荐
相关产品推荐

