小米技术社区
小米技术社区管理员 关于小米

27岁,山西运城人,职业电商经理人,前端开发工作者,从事过网站建设、网络推广、SEO、SEM、信息流推广、二类电商、网络运维、软件开发,等相关电商工作,经验较为丰富,小米技术社区致力于为广大从事Web前端开发的人员提供一些力所能及的引导和帮助 ...[更多]

E-mail:mzze@163.com

Q Q:32362389

W X:xiaomi168527

小米技术社区大牛王飞 关于王飞

27岁,山西运城人,职业电商经理人,网络工程师兼运维,从事过运营商网络建设,企业网络建设、优化。数据中心网络维护等通过,经验丰富,座右铭:当自己休息的时候,别忘了别人还在奔跑。 ...[更多]

E-mail:wf_live@126.com

Q Q:3940019

微博:王小贱ss

小米技术社区设计小艳 关于小艳

大于花一样的年龄,河南郑州是我家,2010年在北京接触团购网,2011年进入天猫淘宝一待就是四年,如今已经将设计走向国际化(ps:误打误撞开始进入阿里巴巴国际站的设计,嘿嘿)五年电商设计,丰富经验,从事过天猫淘宝阿里各项设计,店铺运营,产品拍摄;我将我的经历与您分享是我的快乐!座右铭:越努力越幸运! ...[更多]

E-mail:97157726@qq.com

Q Q:97157726

标签云
精品推荐
您的位置:首页 > 工作软件 > Photoshop

Photoshop全自动批量替换PSD智能对象脚本

分类: Photoshop0个赞

主要功能:

批量替换PSD智能对象

支持批量替换PSD文件中的智能对象或普通图层内容,适用于大量图片处理需求。


自动适配图片尺寸


替换的图片会自动缩放,确保与目标图层的尺寸一致,支持等比例拉伸或裁剪。

大图与左上角对齐,超出部分会被裁剪。

小图拉伸占满画布,程序会自动拉伸,确保完全覆盖目标区域,避免留白。


支持多种图片格式

兼容JPG、PNG、PSD、TIFF等多种常见图片格式,满足多样化需求。


智能图层处理

自动解锁背景图层、栅格化文字图层,确保替换过程顺利进行。


自动保存为JPG

处理完成后,自动将结果保存为高质量JPG文件,方便后续使用。


路径验证与自动创建文件夹

自动验证源文件夹、模板文件路径,若目标文件夹不存在则自动创建,避免运行错误。


错误提示与日志

提供清晰的错误提示信息,帮助用户快速定位问题。

// 全自动批量替换智能对象内容脚本(增强版)
try {
   // ======== 用户配置区域 ========
   var sourceFolder = new Folder(decodeURI("处理路径"));
   var targetFolder = new Folder(decodeURI("存放路径"));
   var templateFile = new File(decodeURI("主图.psd"));
   var layerName = "框架/主图"; // 支持格式:"主图" 或 "组名/子组名/图层名"
   // =============================

   // 增强路径验证
   if (!sourceFolder.exists) throw new Error("源文件夹不存在:" + sourceFolder.fsName);
   if (!templateFile.exists) throw new Error("模板文件不存在:" + templateFile.fsName);
   if (!targetFolder.exists) targetFolder.create();

   var fileList = sourceFolder.getFiles(/\.(jpg|jpeg|png|psd|tif|tiff)$/i);
   if (fileList.length === 0) throw new Error("未找到替换图片");

   for (var i = 0; i < fileList.length; i++) {
       var file = File(fileList[i]);
       var doc = app.open(templateFile);

       try {
           // 智能查找目标图层
           var targetLayer = findLayerByPath(doc, layerName);

           // 通用图层预处理
           unlockLayer(targetLayer);
           rasterizeTextLayer(targetLayer);

           // 智能对象/普通图层分支处理
           if (targetLayer.isSmartObject) {
               targetLayer.smartObject.replaceContents(file);
           } else {
               handleNormalLayer(doc, targetLayer, file, layerName);
           }

           // 保存选项(根据需要切换注释)
           // saveAsJPG(doc, targetFolder, file.name.replace(/\.[^\.]+$/, ".jpg")); //jpg 最清晰版本
           saveAsJPGForWeb(doc, targetFolder, file.name.replace(/\.[^\.]+$/, ".jpg")); //jpg web版
           // saveAsPSD(doc, targetFolder, file.name.replace(/\.[^\.]+$/, ".psd"));
       } finally {
           doc.close(SaveOptions.DONOTSAVECHANGES);
       }
   }
   alert("处理完成,共处理 " + fileList.length + " 个文件");
} catch (e) {
   alert("脚本错误:" + e.message);
}

// ======== 核心函数:分层查找图层 ========
function findLayerByPath(doc, layerPath) {
   var pathArray = layerPath.split('/');
   var currentParent = doc;

   for (var i = 0; i < pathArray.length; i++) {
       var name = pathArray[i];
       var foundLayer = findInLayers(currentParent.layers, name);

       if (!foundLayer) {
           throw new Error("找不到图层路径:" + layerPath + "\n在层级:" + name);
       }

       // 最后一级必须是普通图层
       if (i === pathArray.length - 1) {
           if (foundLayer.typename !== "ArtLayer") {
               throw new Error("目标必须是普通图层:" + name);
           }
           return foundLayer;
       }
       // 中间层级必须是图层组
       else {
           if (foundLayer.typename !== "LayerSet") {
               throw new Error("路径中存在非图层组:" + name);
           }
           currentParent = foundLayer;
       }
   }
}

function findInLayers(layers, targetName) {
   for (var j = 0; j < layers.length; j++) {
       if (layers[j].name === targetName) {
           return layers[j];
       }
   }
   return null;
}

// ======== 原有功能函数 ========
function unlockLayer(layer) {
   if (layer.isBackgroundLayer) layer.isBackgroundLayer = false;
}

function rasterizeTextLayer(layer) {
   if (layer.kind === LayerKind.TEXT) {
       layer.rasterize(RasterizeType.TEXTCONTENTS);
   }
}

function handleNormalLayer(doc, targetLayer, file, layerName) {
   // 替换内容
   var newContent = app.open(file);
   newContent.selection.selectAll();
   newContent.selection.copy();
   newContent.close(SaveOptions.DONOTSAVECHANGES);
   
   // 直接在目标图层上粘贴
   doc.activeLayer = targetLayer;
   doc.paste();

   // 处理新图层
   var newLayer = doc.activeLayer;
   newLayer.name = layerName;

   // 尺寸适配逻辑
   var targetBounds = targetLayer.bounds;
   var targetWidth = targetBounds[2] - targetBounds[0];
   var targetHeight = targetBounds[3] - targetBounds[1];
   var newBounds = newLayer.bounds;
   var newWidth = newBounds[2] - newBounds[0];
   var newHeight = newBounds[3] - newBounds[1];

   // 智能缩放 bbsmi.com
   var scale = Math.max(targetWidth / newWidth, targetHeight / newHeight);
   newLayer.resize(scale * 100, scale * 100, AnchorPosition.TOPLEFT);

   // 位置校准 bbsmi.com
   newLayer.translate(targetBounds[0] - newBounds[0], targetBounds[1] - newBounds[1]);

   // 清理旧图层(可选)
   targetLayer.remove();
}


// ======== 保存函数 ========
function saveAsJPG(doc, folder, fileName) {
   var savePath = new File(folder.fsName + "/" + fileName);
   var jpgOptions = new JPEGSaveOptions();
   jpgOptions.quality = 12;
   doc.saveAs(savePath, jpgOptions, true);
}

function saveAsJPGForWeb(doc, folder, fileName) {
   var savePath = new File(folder.fsName + "/" + fileName);
   var webOptions = new ExportOptionsSaveForWeb();
   webOptions.format = SaveDocumentType.JPEG;
   webOptions.quality = 100;
   doc.exportDocument(savePath, ExportType.SAVEFORWEB, webOptions);
}

function saveAsPSD(doc, folder, fileName) {
   var savePath = new File(folder.fsName + "/" + fileName);
   var psdOptions = new PhotoshopSaveOptions();
   psdOptions.layers = true;
   doc.saveAs(savePath, psdOptions, true);
}


小米技术社区

本站内容均为小米原创,转载请注明出处:小米技术社区>> Photoshop全自动批量替换PSD智能对象脚本