Photoshop 多图自动拼接工具,支持横向 / 纵向排列,一键自动扩展画布并生成长图

Photoshop 自动拼图工具是一款用于批量图片拼接的 JSX 脚本工具。它支持多张 JPG / PNG 图片一键导入,并可根据使用场景选择横向或纵向排列。工具会自动计算总宽度、高度和最大边界,创建合适尺寸的画布,再将图片图层逐一精准定位,确保所有图片完整显示在画布范围内。无需手动扩展画布、拖拽图层或对齐图片,能够显著提升截图整理、界面展示和素材合成效率。

1. 保存为 xxx.jsx

2. 文件 → 脚本 → 浏览 → 选择 xxx.jsx

#target photoshop

app.displayDialogs = DialogModes.NO;

var files = File.openDialog("选择要拼接的图片", "*.jpg;*.jpeg;*.png", true);

if (files && files.length > 0) {

    var isHorizontal = confirm("点击【确定】= 横向拼接\n点击【取消】= 纵向拼接");

    var docs = [];
    var sizes = [];

    var totalWidth = 0;
    var totalHeight = 0;
    var maxWidth = 0;
    var maxHeight = 0;

    // 先打开所有图片并记录尺寸
    for (var i = 0; i < files.length; i++) {
        var doc = app.open(files[i]);

        var w = doc.width.as("px");
        var h = doc.height.as("px");

        docs.push(doc);
        sizes.push({
            width: w,
            height: h
        });

        totalWidth += w;
        totalHeight += h;

        if (w > maxWidth) maxWidth = w;
        if (h > maxHeight) maxHeight = h;
    }

    var canvasWidth = isHorizontal ? totalWidth : maxWidth;
    var canvasHeight = isHorizontal ? maxHeight : totalHeight;

    // 创建结果画布
    var resultDoc = app.documents.add(
        canvasWidth,
        canvasHeight,
        72,
        isHorizontal ? "横向拼接结果" : "纵向拼接结果",
        NewDocumentMode.RGB,
        DocumentFill.WHITE
    );

    var currentX = 0;
    var currentY = 0;

    for (var j = 0; j < docs.length; j++) {
        app.activeDocument = docs[j];

        docs[j].selection.selectAll();
        docs[j].selection.copy();

        app.activeDocument = resultDoc;
        resultDoc.paste();

        var layer = resultDoc.activeLayer;
        layer.name = "图片_" + (j + 1);

        // 关键修复:读取当前图层实际位置
        var bounds = layer.bounds;
        var layerLeft = bounds[0].as("px");
        var layerTop = bounds[1].as("px");

        var targetX = 0;
        var targetY = 0;

        if (isHorizontal) {
            // 横向:从左到右,顶部对齐
            targetX = currentX;
            targetY = 0;

            currentX += sizes[j].width;
        } else {
            // 纵向:从上到下,左侧对齐
            targetX = 0;
            targetY = currentY;

            currentY += sizes[j].height;
        }

        // 不是直接 translate(currentX, 0),而是移动到精确坐标
        layer.translate(targetX - layerLeft, targetY - layerTop);

        docs[j].close(SaveOptions.DONOTSAVECHANGES);
    }

    app.activeDocument = resultDoc;

    alert(isHorizontal ? "横向拼接完成" : "纵向拼接完成");
}
posted @ 2026-05-08 20:58  _迷途  阅读(141)  评论(0)    收藏  举报