Automatización de Panorama Múltiple en Photoshop

Mi flujo de trabajo contiene la creación de múltiples panoramas en Photoshop uno por uno. Tengo varias carpetas, cada una con jpegs que deben combinarse en un panorama y guardarse con una extensión PSD.

Photoshop hace un buen trabajo al producir el panorama, pero pierdo mucho tiempo interviniendo en los pasos repetitivos de seleccionar carpetas y su contenido, abrirlos en el cuadro de panorama y seleccionar las opciones de panorama requeridas (lo que incluye marcar la reposición y desmarcar la combinación). imágenes juntas) antes de que Photoshop haga su magia de fusión de fotos. Además, pierdo tiempo en el cuadro de diálogo Guardar para guardar cada imagen después de generar el panorama.

Quería saber si hay un script que pueda automatizar toda esta tarea. Así que proporciono la carpeta principal (que tiene las carpetas de fotos que necesitaban ser unidas) y dejo la computadora durante horas mientras procesa el photomerge y guarda los archivos PSD resultantes sin que yo tenga que sentarme al lado. Tengo la sensación de que esto es posible porque todos los pasos son repetitivos.

Los foros antiguos tienen soluciones para muchos problemas similares, con asistentes que crean scripts para los mismos, pero ninguno de los enlaces funciona ahora.

hola y bienvenido a GDSE. sí, debería ser posible con secuencias de comandos, supongo, pero a su pregunta le faltan algunos puntos, como cómo hace exactamente esa imagen y la reemplaza y qué tipo de capas tiene, etc. Si es posible, puede compartir una captura de pantalla para una mejor comprensión :)

Respuestas (1)

Aquí, modifiqué ligeramente este guión de Mike Hale. Este script le pedirá una carpeta y luego procesará todas las subcarpetas con imágenes. Cosas para cambiar:

  1. Asegúrese de que la ruta a su carpeta Photoshop Scripts sea correcta (línea 2);
  2. Este script está buscando .pngarchivos, modifique la extensión en la línea 24 ( folders[i].getFiles('*.png'););
  3. Los PSD se guardarán en cada subcarpeta.

Resultado (tomé algunas imágenes aleatorias de Google para la prueba):

ingrese la descripción de la imagen aquí

var runphotomergeFromScript = true; // must be before Photomerge include
//@includepath "/C/Program Files/Adobe/Adobe Photoshop CC 2019/Presets/Scripts/"
//@include "Photomerge.jsx"
//@show include

var psdOpts = new PhotoshopSaveOptions();
psdOpts.embedColorProfile = true;
psdOpts.alphaChannels = true;
psdOpts.layers = true;

(function()
{
    var workFolder = Folder.selectDialog();
    if (workFolder == null) return false;

    var folders = workFolder.getFiles(function(file)
    {
        return file instanceof Folder;
    });

    if (folders.length == 0) return false

    for (var i = 0; i < folders.length; i++)
    {

        var fList = folders[i].getFiles('*.png');

        // override Photomerge.jsx settings. Default is "Auto". Uncomment to override the default.
        //photomerge.alignmentKey = "Auto";
        //photomerge.alignmentKey   = "Prsp";
        //photomerge.alignmentKey   = "cylindrical";
        //photomerge.alignmentKey   = "spherical";
        //photomerge.alignmentKey   = "sceneCollage";
        photomerge.alignmentKey = "translation"; // "Reposition" in layout dialog   

        // other setting that may need to be changed. Defaults below
        photomerge.advancedBlending = false; // 'Blend Images Together' checkbox in dialog
        photomerge.lensCorrection = false; // Geometric Distortion Correction'checkbox in dialog
        photomerge.removeVignette = false; // 'Vignette Removal' checkbox in dialog

        try
        {
            if (fList.length > 1)
            {
                photomerge.createPanorama(fList, false);
            }
        }
        catch (e)
        {
            alert(e + '\nLine: ' + e.line)
        }
        // saving
        var saveFile = {
            name: folders[i].name,
            path: fList[0].parent
        }

        savePSB(saveFile)
        saveTIF(saveFile)
        saveJPG(saveFile)
        savePSD(saveFile)

        activeDocument.close(SaveOptions.DONOTSAVECHANGES);
    }
})()

function savePSB(data)
{
    var desc = new ActionDescriptor();
    var descCompatibility = new ActionDescriptor();
    descCompatibility.putBoolean(stringIDToTypeID('maximizeCompatibility'), true);
    desc.putObject(charIDToTypeID('As  '), charIDToTypeID('Pht8'), descCompatibility);
    desc.putPath(charIDToTypeID('In  '), new File(data.path + "/" + data.name + ".psb"));
    executeAction(charIDToTypeID('save'), desc, DialogModes.NO);
}; // end of savePSB()

function saveTIF(data)
{
    var desc = new ActionDescriptor();
    var descOptions = new ActionDescriptor();
    descOptions.putEnumerated(charIDToTypeID('BytO'), charIDToTypeID('Pltf'), charIDToTypeID('Mcnt'));
    descOptions.putEnumerated(stringIDToTypeID('layerCompression'), charIDToTypeID('Encd'), stringIDToTypeID('RLE'));
    desc.putObject(charIDToTypeID('As  '), charIDToTypeID('TIFF'), descOptions);
    desc.putPath(charIDToTypeID('In  '), new File(data.path + "/" + data.name + ".tif"));
    executeAction(charIDToTypeID('save'), desc, DialogModes.NO);
}; // end of saveTIF()

function saveJPG(data)
{
    if (data.path == undefined) return false;
    data.name = data.name == undefined ? activeDocument.name : data.name;
    data.quality == undefined && data.quality = 75

    var options = new ExportOptionsSaveForWeb(),
        jpgFile = new File(data.path + '/' + data.name + '.jpg');
    options.format = SaveDocumentType.JPEG;
    options.quality = data.quality;
    activeDocument.exportDocument(jpgFile, ExportType.SAVEFORWEB, options);
}

function savePSD(data)
{
    var desc = new ActionDescriptor();
    var descOptions = new ActionDescriptor();
    descOptions.putBoolean(stringIDToTypeID('maximizeCompatibility'), true);
    desc.putObject(charIDToTypeID('As  '), charIDToTypeID('Pht3'), descOptions);
    desc.putPath(charIDToTypeID('In  '), new File(data.path + "/" + data.name + ".psd"));
    executeAction(charIDToTypeID('save'), desc, DialogModes.NO);
} // end of savePSD()
¡Muchas gracias por el guión! Funciona muy bien y hace maravillas con mi flujo de trabajo. Quiero agradecerles nuevamente por ayudarme con esto. Funciona bien con todos mis tipos de archivos requeridos también. Quisiera hacerle dos preguntas sobre el guión. En primer lugar, ¿hay alguna forma de que el nombre de archivo del psd guardado se cambie al nombre de la carpeta en lugar de "completado"? Y en segundo lugar, ¿hay alguna forma de guardar el archivo como un documento psb o también como un documento tif? Intenté jugar con las últimas líneas, pero no pareció funcionar.
He actualizado mi respuesta. Esta versión guardará ambos psby tifcon el nombre de una carpeta de archivos combinados. Si solo necesita uno de los archivos, simplemente elimine la línea 58 o 59.
¡Sergio! Quiero molestarte de nuevo. ¿Cuáles serían los cambios en el código para guardar el archivo final como jpeg?
:) Actualicé mi respuesta. saveJPG()utiliza Save For Web de Photoshop y también puede recibir qualitycomo argumento opcional (75 por defecto). Si desea guardar con una calidad diferente, modifique el argumento a algo comosaveJPG({name: folders[i].name, path: fList[0].parent, quality: 90})
Querido Sergey, espero que hayas estado bien en esos tiempos difíciles. Muchas gracias por ayudarme con este script. Sólo hay una pequeña pregunta que quería hacer. A veces, cuando Photoshop no puede fusionar las imágenes correctamente, dice esta alerta de secuencia de comandos en una ventana emergente: "Algunas imágenes no se pudieron alinear automáticamente". Esto detiene el script anterior y tengo que presionar "OK" antes de que se reanude el proceso. ¿Hay alguna manera de que podamos automatizar este proceso de hacer clic en "Aceptar" y continuar sin detener el script? Hágamelo saber. ¡Gracias de nuevo!
Hola. Supongo que puedes encontrar esta línea en el código del script y comentarla para deshabilitar el mensaje.
¡Seguro! Suena realmente fácil. ¿Sería posible que me orientara sobre cómo hacerlo? ¡Gracias!
Te guié: escribí qué hacer :) Lo siento, no se suponía que esta respuesta fuera un trabajo de secuencias de comandos gratuito
Gracias por tu ayuda Sergio!
Solo hay un último problema al que me enfrento con su secuencia de comandos, que impide que funcione. Sigue dándome este mensaje "Error 21: indefinido no es un objeto. Línea 53 -> var saveFile = { "Déjame saber cómo puedo evitar esto
@AbPro ¿quizás lo has copiado mal? debería funcionar bien