吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 269|回复: 9
上一主题 下一主题
收起左侧

[其他求助] PS批量套图脚本

[复制链接]
跳转到指定楼层
楼主
sdds 发表于 2026-8-7 22:49 回帖奖励
150吾爱币
需要一个PS批量套图脚本,大概就是衣服固定部位有一个智能对象,自己没有编程能力,AI自己写写不出来,统统报错(明明是智能对象,找不到,遂改指定名称图层,说不是智能对象,其实也是智能对象,然后七调八调,现在直接跳出选项面板了),求大神指导,并帮我写一份!

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
 楼主| sdds 发表于 2026-8-7 23:32 |楼主
不用了,写出来了,豆包写的不行
3#
admvlz 发表于 2026-8-8 10:13
4#
 楼主| sdds 发表于 2026-8-8 20:47 |楼主
admvlz 发表于 2026-8-8 10:13
那你是用包豆写的啊

不是,因为用的CS6习惯了,但是是精简版的,我就一直喊他适配,结果就寄了
5#
 楼主| sdds 发表于 2026-8-8 20:48 |楼主
// ============================================
// 批量替换PSD样机智能对象 - Photoshop 2020专用版
// 版本:3.1
// 日期:2026-08-07
// 兼容性:Photoshop 2020(21.x)及以上
// 功能:替换智能对象,等比缩放至最大填满
// 优化:每个样机跑完所有参考再保存,按样机名字新建文件夹
// ============================================

// 主函数
function batchReplaceMockup() {
    // 1. 选择样机文件夹
    var mockupFolder = Folder.selectDialog("请选择包含PSD样机文件的文件夹");
    if (mockupFolder == null) return;

    // 2. 选择素材图片文件夹
    var imageFolder = Folder.selectDialog("请选择素材图片文件夹(JPEG/JPG/PNG)");
    if (imageFolder == null) return;

    // 3. 选择输出文件夹
    var outputFolder = Folder.selectDialog("请选择输出文件夹");
    if (outputFolder == null) return;

    // 4. 获取文件列表
    var mockupFiles = mockupFolder.getFiles(/\.(psd|PSD)$/);
    if (mockupFiles.length === 0) {
        alert("未找到PSD文件,请检查文件夹路径。");
        return;
    }

    var imageFiles = imageFolder.getFiles(/\.(jpg|jpeg|png)$/i);
    if (imageFiles.length === 0) {
        alert("未找到JPEG/JPG/PNG格式的图片素材,请检查文件夹路径。");
        return;
    }

    // 5. 设置选项
    var exportFormat = "png";
    var totalMockups = mockupFiles.length;
    var totalImages = imageFiles.length;
    var successCount = 0;
    var errorCount = 0;
    var errorLog = "";
   
    // 关闭对话框提示,加快处理速度
    app.displayDialogs = DialogModes.NO;

    // 6. 遍历处理每个样机文件
    for (var m = 0; m < totalMockups; m++) {
        var mockupDoc = null;
        try {
            // 获取样机文件名(不含扩展名)
            var mockupName = mockupFiles[m].name.replace(/\.(psd|PSD)$/, "");
            
            // 创建样机对应的输出文件夹
            var mockupOutputFolder = new Folder(outputFolder.fsName + "/" + mockupName);
            if (!mockupOutputFolder.exists) {
                mockupOutputFolder.create();
            }
            
            // 打开PSD文档
            mockupDoc = app.open(mockupFiles[m]);
            app.activeDocument = mockupDoc;
            
            // 查找智能对象(2020稳定方式)
            var targetLayer = findSmartObject2020(mockupDoc);
            
            if (targetLayer == null) {
                errorLog += "样机 " + mockupFiles[m].name + " 中未找到智能对象,跳过。\n";
                errorCount += totalImages; // 该样机所有图片都失败
                mockupDoc.close(SaveOptions.DONOTSAVECHANGES);
                continue;
            }

            // 记录目标尺寸
            var targetBounds = targetLayer.bounds;
            var targetWidth = targetBounds[2].value - targetBounds[0].value;
            var targetHeight = targetBounds[3].value - targetBounds[1].value;

            // 对当前样机,依次处理所有参考图片
            for (var i = 0; i < totalImages; i++) {
                try {
                    var imageFile = imageFiles[i];
                    
                    // 使用2020稳定的智能对象替换方法
                    replaceSmartObject2020(mockupDoc, targetLayer, imageFile);
                    
                    // 获取替换后的智能对象
                    var smartObj = mockupDoc.activeLayer;
                    
                    // 获取替换后图片的尺寸
                    var smartBounds = smartObj.bounds;
                    var smartWidth = smartBounds[2].value - smartBounds[0].value;
                    var smartHeight = smartBounds[3].value - smartBounds[1].value;
                    
                    // 计算缩放比例(保持原图比例,填满目标区域)
                    var scaleX = targetWidth / smartWidth;
                    var scaleY = targetHeight / smartHeight;
                    var scale = Math.max(scaleX, scaleY);
                    
                    // 应用缩放(2020稳定方式)
                    smartObj.resize(scale * 100, scale * 100, AnchorPosition.MIDDLECENTER);
                    
                    // 保存输出文件到样机对应的文件夹
                    var outputFileName = mockupName + "_" +
                                         imageFile.name.replace(/\.[^\.]+$/, "") + "." + exportFormat;
                    var outputFile = new File(mockupOutputFolder.fsName + "/" + outputFileName);
                    
                    var saveOptions = new PNGSaveOptions();
                    saveOptions.compression = 9;
                    mockupDoc.saveAs(outputFile, saveOptions, true, Extension.LOWERCASE);
                    
                    successCount++;
                    
                } catch (e) {
                    errorLog += "样机 " + mockupFiles[m].name + " 图片 " + imageFiles[i].name + " 处理失败: " + e.toString() + "\n";
                    errorCount++;
                    continue;
                }
            }

            // 当前样机的所有图片处理完成,关闭样机文档
            if (mockupDoc) {
                mockupDoc.close(SaveOptions.DONOTSAVECHANGES);
                mockupDoc = null;
            }
            
        } catch (e) {
            errorLog += "样机 " + mockupFiles[m].name + " 处理失败: " + e.toString() + "\n";
            errorCount++;
            if (mockupDoc) {
                try { mockupDoc.close(SaveOptions.DONOTSAVECHANGES); } catch (closeErr) {}
                mockupDoc = null;
            }
            continue;
        }
    }

    // 恢复对话框显示设置
    app.displayDialogs = DialogModes.ALL;

    // 输出结果
    showResult(successCount, errorCount, totalMockups, totalImages, errorLog);
}

// 查找智能对象(2020稳定方式)
function findSmartObject2020(doc) {
    for (var i = 0; i < doc.layers.length; i++) {
        var layer = doc.layers[i];
        try {
            // 2020中智能对象的判断方式
            if (layer.kind === LayerKind.SMARTOBJECT) {
                return layer;
            }
        } catch (e) {
            // 继续查找下一个图层
        }
    }
    return null;
}

// 替换智能对象内容(2020稳定方式,使用ActionManager)
function replaceSmartObject2020(doc, targetLayer, imageFile) {
    // 激活目标图层
    doc.activeLayer = targetLayer;
   
    // 使用ActionManager替换智能对象内容(2020稳定方式)
    var idplacedLayerReplaceContents = stringIDToTypeID("placedLayerReplaceContents");
    var desc = new ActionDescriptor();
    var idnull = charIDToTypeID("null");
    desc.putPath(idnull, new File(imageFile));
    var idPgNm = charIDToTypeID("PgNm");
    desc.putInteger(idPgNm, 1);
    executeAction(idplacedLayerReplaceContents, desc, DialogModes.NO);
}

// 显示结果的辅助函数
function showResult(successCount, errorCount, totalMockups, totalImages, errorLog) {
    var resultMsg = "批量套图完成!\n";
    resultMsg += "═══════════════════════════\n";
    resultMsg += "成功处理: " + successCount + " 张\n";
    resultMsg += "错误数: " + errorCount + " 个\n";
    resultMsg += "共处理 " + totalMockups + " 个样机\n";
    resultMsg += "每个样机替换 " + totalImages + " 张图片\n";
    resultMsg += "═══════════════════════════\n";
    resultMsg += "脚本作者:Q12310061\n";
    resultMsg += "版本:3.1\n";
    resultMsg += "═══════════════════════════\n";
   
    if (errorLog.length > 0) {
        resultMsg += "\n错误日志:\n";
        resultMsg += "───────────────────────\n";
        resultMsg += errorLog;
    }
   
    alert(resultMsg);
}

// 运行主函数
try {
    batchReplaceMockup();
} catch (e) {
    alert("脚本运行出错: " + e.toString() + "\n\n请尝试以管理员身份运行Photoshop。");
}
6#
 楼主| sdds 发表于 2026-8-8 20:50 |楼主
大概就是这样,其实可以优化一下,比如把那个自由变换加上,包括但不限于衣服的褶皱感,然后对齐就好了
7#
jyjjf 发表于 2026-8-9 07:46
sdds 发表于 2026-8-8 20:50
大概就是这样,其实可以优化一下,比如把那个自由变换加上,包括但不限于衣服的褶皱感,然后对齐就好了{:1_ ...

有样图吗?
8#
chengzi527 发表于 2026-8-15 09:49
我前几天也做了一个批量套图插件,最开始让千问给我做套图脚本,他只能用智能对象替换图片,我觉得不满意。后面觉得PS数据组功能就不错,改做了数据组功能。
因为我用的是PS2020,做数组的时候,有一点问题很容易就软件崩溃,索性自己做了一个,不会软件崩溃,还能一键输入变量名称,不需要像PS一样一个个键入变量,原本做好的PS数组也能直接在插件里使用。
功能支持导入导出数据,还能在插件里删除/加入新内容,随时修改内容。
同样支持数据组查看,将数据组应用到图层上查看。
导出界面也做了几个调整,PS自带的数据组需要导出PSD,然后才能导出图片。我参考其他助理插件,改用打勾选项,支持勾选同时导出PSD源文件。

9#
xiaopang521 发表于 2026-8-16 09:32
sdds 发表于 2026-8-8 20:48
// ============================================
// 批量替换PSD样机智能对象 - Photoshop 2020专用版
...

太厉害了
10#
xiaopang521 发表于 2026-8-16 09:32
chengzi527 发表于 2026-8-15 09:49
我前几天也做了一个批量套图插件,最开始让千问给我做套图脚本,他只能用智能对象替换图片,我觉得不满意。 ...

厉害厉害
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-8-16 09:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表