Photoshop脚本 完整脚本示例
这里提供几个常见自动化场景的完整代码,你可以直接保存为 .jsx 文件在 Photoshop 中运行。
示例 1:批量调整图像大小并保存为 JPEG
这个脚本遍历指定文件夹中的所有 PSD 和 JPG 文件,统一调整尺寸后保存为 JPEG:
javascript
// batchResize.jsx
// 批量调整图像大小并保存为 JPEG
var inputFolder = Folder.selectDialog("请选择源文件夹");
if (!inputFolder) {
alert("未选择源文件夹");
} else {
var outputFolder = Folder.selectDialog("请选择输出文件夹");
if (!outputFolder) {
alert("未选择输出文件夹");
} else {
var files = inputFolder.getFiles("*.psd;*.jpg;*.jpeg");
var count = 0;
for (var i = 0; i < files.length; i++) {
var file = files[i];
if (!file.exists) continue;
var doc = app.open(file);
// 调整到统一尺寸(最长边 1920 像素,保持比例)
if (doc.width > doc.height) {
doc.resizeImage(1920, null, 72, ResampleMethod.BICUBIC);
} else {
doc.resizeImage(null, 1920, 72, ResampleMethod.BICUBIC);
}
// 设置 JPEG 保存选项
var jpegOpt = new JPEGSaveOptions();
jpegOpt.quality = 10; // 1-12,12 最高质量
jpegOpt.embedColorProfile = true;
jpegOpt.formatOptions = FormatOptions.STANDARDBASELINE;
// 生成输出文件名
var outName = file.name.replace(/\.[^.]+$/, "") + ".jpg";
var outFile = new File(outputFolder.fsName + "/" + outName);
doc.saveAs(outFile, jpegOpt, true, Extension.LOWERCASE);
doc.close(SaveOptions.DONOTSAVECHANGES);
count++;
}
alert("批量处理完成!共转换 " + count + " 个文件");
}
} 示例 2:自动生成社交媒体宣传图
以下脚本创建一个 1080×1080 的方形图片,添加背景色和标题文字,适合制作社交媒体海报:
javascript
// createSocialPost.jsx
// 自动生成社交媒体宣传图
var doc = app.documents.add(1080, 1080, 72, "社交媒体图片", NewDocumentMode.RGB);
doc.resizeCanvas(1080, 1080, AnchorPosition.MIDDLECENTER);
// 添加背景色图层
var bgLayer = doc.artLayers.add();
bgLayer.name = "背景色";
var bgColor = new SolidColor();
bgColor.rgb.red = 30;
bgColor.rgb.green = 30;
bgColor.rgb.blue = 60;
doc.selection.selectAll();
doc.selection.fill(bgColor, ColorBlendMode.NORMAL, 100, false);
doc.selection.deselect();
// 添加装饰色块
var accentLayer = doc.artLayers.add();
accentLayer.name = "装饰色块";
var accentColor = new SolidColor();
accentColor.rgb.hexValue = "FFB432";
doc.selection.select(
[[0, 400], [1080, 400], [1080, 680], [0, 680]],
SelectionType.REPLACE, 0, false
);
doc.selection.fill(accentColor, ColorBlendMode.NORMAL, 100, false);
doc.selection.deselect();
// 添加标题文字
var titleLayer = doc.artLayers.add();
titleLayer.kind = LayerKind.TEXT;
titleLayer.name = "标题";
titleLayer.textItem.contents = "Photoshop 自动化";
titleLayer.textItem.size = 72;
titleLayer.textItem.color = accentColor;
titleLayer.textItem.justification = Justification.CENTER;
titleLayer.textItem.position = [540, 250];
// 添加副标题
var subLayer = doc.artLayers.add();
subLayer.kind = LayerKind.TEXT;
subLayer.name = "副标题";
subLayer.textItem.contents = "用脚本解放双手";
subLayer.textItem.size = 36;
var whiteColor = new SolidColor();
whiteColor.rgb.hexValue = "FFFFFF";
subLayer.textItem.color = whiteColor;
subLayer.textItem.justification = Justification.CENTER;
subLayer.textItem.position = [540, 500];
// 导出为 PNG
var pngFile = new File("C:/Users/Administrator/Desktop/social-post.png");
var sfwOpts = new ExportOptionsSaveForWeb();
sfwOpts.format = SaveDocumentType.PNG;
sfwOpts.PNG8 = false;
sfwOpts.transparency = true;
doc.exportDocument(pngFile, ExportType.SAVEFORWEB, sfwOpts);
alert("社交媒体图片已生成!\n保存位置: " + pngFile.fsName);
doc.close(SaveOptions.DONOTSAVECHANGES); 示例 3:导出所有可见图层为独立 PNG
这个脚本遍历文档中的所有可见图层,每次只显示一个图层,将其余隐藏,然后单独导出为 PNG:
javascript
// exportLayers.jsx
// 导出所有可见图层为独立 PNG 文件
if (app.documents.length === 0) {
alert("没有打开的文档");
} else {
var doc = app.activeDocument;
var layers = doc.artLayers;
if (layers.length === 0) {
alert("文档中没有图层");
} else {
var exportFolder = Folder.selectDialog("请选择导出文件夹");
if (!exportFolder) {
alert("未选择导出文件夹");
} else {
// 记录每个图层的初始可见性
var originalVisibility = [];
for (var i = 0; i < layers.length; i++) {
originalVisibility.push(layers[i].visible);
}
for (var i = 0; i < layers.length; i++) {
var layer = layers[i];
if (!layer.visible) continue; // 跳过已经不可见的图层
// 隐藏所有图层
for (var j = 0; j < layers.length; j++) {
layers[j].visible = false;
}
// 只显示当前图层
layer.visible = true;
// 导出为 PNG
var safeName = layer.name.replace(/[\\/:*?"<>|]/g, "_");
var pngFile = new File(exportFolder.fsName + "/" + safeName + ".png");
var sfwOpts = new ExportOptionsSaveForWeb();
sfwOpts.format = SaveDocumentType.PNG;
sfwOpts.PNG8 = false;
sfwOpts.transparency = true;
doc.exportDocument(pngFile, ExportType.SAVEFORWEB, sfwOpts);
}
// 恢复图层的初始可见性
for (var i = 0; i < layers.length; i++) {
layers[i].visible = originalVisibility[i];
}
alert("导出完成!共导出 " + layers.length + " 个图层\n保存位置: " + exportFolder.fsName);
}
}
} 示例 4:使用图层命名约定管理设计元素
大型项目中往往有成百上千个图层。通过在图层名中编码元数据,可以实现按分类自动组织导出任务:
javascript
// 命名规则示例:类型 @说明 .SKU编号位置ID
// "主图 @红色款 .1A1" → SKU 1, 位置 A1
// "细节 @材质 .1B2" → SKU 1, 位置 B2
// "装饰 @logo .2A1" → SKU 2, 位置 A1
function parseLayerName(layerName) {
var parts = layerName.match(/^(.+?)\s*@(.+?)\.(\d+)([A-Z]\d+)$/);
if (!parts) return null;
return {
type: parts[1].trim(),
description: parts[2].trim(),
skuID: Number(parts[3]),
posID: parts[4]
};
}
function groupBySKU() {
var doc = app.activeDocument;
var groups = {};
for (var i = 0; i < doc.artLayers.length; i++) {
var layer = doc.artLayers[i];
var info = parseLayerName(layer.name);
if (!info) continue;
if (!groups[info.skuID]) {
groups[info.skuID] = [];
}
groups[info.skuID].push({
layer: layer,
info: info
});
}
return groups;
}
// 按 SKU 分组导出
var groups = groupBySKU();
for (var sku in groups) {
var folder = new Folder("C:/Users/Administrator/Desktop/export/SKU_" + sku);
if (!folder.exists) folder.create();
for (var j = 0; j < groups[sku].length; j++) {
var item = groups[sku][j];
item.layer.visible = true;
var file = new File(folder.fsName + "/" + item.info.posID + ".png");
var opts = new ExportOptionsSaveForWeb();
opts.format = SaveDocumentType.PNG;
opts.PNG8 = false;
opts.transparency = true;
app.activeDocument.exportDocument(file, ExportType.SAVEFORWEB, opts);
item.layer.visible = false;
}
} 这种模式在生产环境中广泛使用——设计师按照约定命名图层,脚本自动完成分类和导出,无需逐个手动操作。
示例 5:模块化脚本组织模式
当脚本包含多个功能模块时,使用 #include 指令拆分文件:
plaintext
project/
├── main.jsx # 入口——调用各模块
├── config.jsxinc # 配置(路径、尺寸等常量)
├── utils.jsxinc # 工具函数
└── lib/
├── export.jsxinc # 导出功能
└── text.jsxinc # 文本处理 javascript
// config.jsxinc —— 集中管理路径和参数
var CONFIG = {
outputDir: "C:/Users/Administrator/Desktop/output/",
defaultWidth: 1920,
jpegQuality: 12
};
function getOutputPath(filename) {
return CONFIG.outputDir + filename;
} javascript
// main.jsx —— 入口文件,组合各模块
#include "config.jsxinc"
#include "utils.jsxinc"
#include "lib/export.jsxinc"
#include "lib/text.jsxinc"
app.displayDialogs = DialogModes.NO;
var folder = new Folder("C:/Users/Administrator/Desktop/source");
if (!folder.exists) {
alert("源文件夹不存在");
} else {
var files = folder.getFiles("*.psd");
for (var i = 0; i < files.length; i++) {
processFile(files[i]);
}
alert("处理完成!共处理 " + files.length + " 个文件");
} 优势:
- 配置分离 —
config.jsxinc集中管理路径和参数,修改配置无需翻找主逻辑 - 复用性 —
utils.jsxinc中的工具函数可在多个脚本间共享 - 可维护性 — 按功能拆分文件,每个文件职责单一