Search code examples
javascriptphotoshopphotoshop-script

From Photoshop actions to Photoshop scripting?


I would like Photoshop to automatically execute the following task for a given folder:

  1. Load all PNG files in a given folder.
  2. Convert each file's mode to RGB color
  3. Add one layer to each file
  4. Save the files as PSD in the same folder

I have been told that this can be done with Photoshop scripting, but I don't know how to get started since unfortunately I don't have much experience with JavaScript.

One thing I know is that I can't run the task above using Actions because when I record the last step (4), Photoshop records the action to save the PSD files in the folder that I use when recording the macro (instead of the one used to load the original PNG files). In other words, it fixes the destination folder to the one used in the macro.

This takes me to the following question: Is there a way to automatically generate the Photoshop Javascript code that runs a given action?

If so, I wouldn't mind learning how to modify the script to fix the above folder problem.


Solution

  • I made a script which does the required job:

    #target photoshop
    #strict on
    
    runthis();
    function runthis()
    {
        var path = "/d/PhotoshopScript/Images/";
    
         var inputFolder = new Folder(path );
        var inputFiles = inputFolder.getFiles("*.png");
    
        for(index in inputFiles)
        {
            // open the file
            var fileToOpen = new File(inputFiles[index]);
            open(fileToOpen);
    
            // Change mode to rgb
            activeDocument.changeMode(ChangeMode.RGB);
            // add a new layer
            activeDocument.artLayers.add();
    
            //save
            var psdOptions = new PhotoshopSaveOptions();
            psdOptions.alphaChannels = true;
            psdOptions.annotations = false;
            psdOptions.embedColorProfile = false;
            psdOptions.layers = true;
            psdOptions.spotColors = false;
    
            var file = new File(path + GetFileName(String(inputFiles[index])));
            activeDocument.saveAs(file, psdOptions);
    
            activeDocument.close();
    
            // dispose
            fileToOpen = null;
            psdOptions = null;
            file  = null;
        }
        // dispose
        inputFolder = null;
        inputFiles = null;
    
    }
    
    function GetFileName(fullPath)
    {
        var m = fullPath.match(/(.*)[\/\\]([^\/\\]+)\.\w+$/);
        return m[2];
    }
    

    It can be improved in many ways, but I hope it helps.