主要功能:
批量替换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);
}
