You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量替换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();

关键说明

  1. 材质遍历逻辑:threeDLayer.materials是材质数组,需要遍历所有材质来查找目标纹理,避免遗漏。
  2. 纹理定位:使用TextureType.BASECOLOR枚举类型定位Base Color纹理,这是最可靠的方式,不受界面语言影响;如果遇到旧版本PS不支持枚举,可启用注释的名称匹配逻辑。
  3. 纹理替换:调用texture.replace()方法传入新图片的文件对象,确保使用绝对路径避免路径错误。
  4. 批量处理:示例中包含batchProcess函数,可根据实际需求修改模板路径、图片文件夹和输出路径。

内容的提问来源于stack exchange,提问作者user24297021

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 07:54:56