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 中的工具函数可在多个脚本间共享
  • 可维护性 — 按功能拆分文件,每个文件职责单一