Skip to main content
Participant
August 24, 2016
Answered

Repeat action and save file

  • August 24, 2016
  • 2 replies
  • 6779 views

Hello,

I'm having a fever and trying to accomplish something that seems very simple without knowing anything about scripting.

I've made an action that applies some simple effects (blur, threshold and high pass). What I want to do is to repeat the action for n times and save an incremental png for each repetition so that I end up with a numbered file sequence of the action being applied more and more ( like in this example Photoshop Cs5 Filters Animation on Vimeo).

After som googling I ended up using AppleScript and was able to repeat the action for as many times as I want, but I'm completely stuck on the file saving part. This is what I have at the moment:

Any help is greatly appreciated!

tell application "Adobe Photoshop CC 2015.5"

     set StartingPoint to current document

     set theFilePath to file path of current document

          repeat with n from 1 to 10

               set myFile to theFilePath & ":output:image" & {n as string} & ".png"

               do action "CrazyAction" from "Default Actions"

               save current document in file myFile as PNG with options {class:PNG save options, interlaced:false}

          end repeat

end tell

In case someone comes up with the solution I also have another related question: how can I make sure the output file names will have some padding in the number? Ideally I'd end up with image001.png, image002.png and so on rather than image1.png, image2.png.

Many thanks in advance!

This topic has been closed for replies.
Correct answer Chuck Uebele

One of the things you can do with javascript that you can't do with applescript is to use the scriptlistener plugin. This plugin is put into the photoshop plugins folder, and when it's there (you don't want to leave it there all the time) it will record pretty much everything you do, much like an action, but it will generate code to a log file on your desktop. I used it for recording running an action and for saving the png. Those parts of the code are in the functions in the script. So I just established a base folder name, a base file name, and a starting counter. The script will then run your action and save a png to that base folder and change the base file name by the counter increasing by one each time. You need to put in the name of your action and the name of the action set into the script.

#target photoshop

var fileName = 'myFile-';

var folderPath = new Folder (Folder.desktop +'/action test/')//create whatever path you want here. Make sure the folder exists!

var doc = activeDocument;

var counter = 1//counter for changing the filename

for (var i=0;i<4;i++){//Change number 4 to whatever number you want it to repeat + 1

    runMyAction ("twirl", "Chuck");//put in action name and action set name. This line can be duplicated for different actions.

    savePNG ()

    counter++

    }

function runMyAction(myAction, myActionSet){

    var idPly = charIDToTypeID( "Ply " );

        var desc25 = new ActionDescriptor();

        var idnull = charIDToTypeID( "null" );

            var ref8 = new ActionReference();

            var idActn = charIDToTypeID( "Actn" );

            ref8.putName( idActn, myAction );//changed to a variable

            var idASet = charIDToTypeID( "ASet" );

            ref8.putName( idASet, myActionSet );//Changed to a variable

        desc25.putReference( idnull, ref8 );

    executeAction( idPly, desc25, DialogModes.NO );

    }

function savePNG(){

    var idsave = charIDToTypeID( "save" );

        var desc28 = new ActionDescriptor();

        var idAs = charIDToTypeID( "As  " );

            var desc29 = new ActionDescriptor();

            var idPGIT = charIDToTypeID( "PGIT" );

            var idPGIT = charIDToTypeID( "PGIT" );

            var idPGIN = charIDToTypeID( "PGIN" );

            desc29.putEnumerated( idPGIT, idPGIT, idPGIN );

            var idPNGf = charIDToTypeID( "PNGf" );

            var idPNGf = charIDToTypeID( "PNGf" );

            var idPGAd = charIDToTypeID( "PGAd" );

            desc29.putEnumerated( idPNGf, idPNGf, idPGAd );

            var idCmpr = charIDToTypeID( "Cmpr" );

            desc29.putInteger( idCmpr, 9 );

        var idPNGF = charIDToTypeID( "PNGF" );

        desc28.putObject( idAs, idPNGF, desc29 );

        var idIn = charIDToTypeID( "In  " );

        desc28.putPath( idIn, new File( folderPath + '/'+ fileName + counter+ ".png" ) );//set folder path and name

        var idDocI = charIDToTypeID( "DocI" );

        desc28.putInteger( idDocI, 200 );

        var idCpy = charIDToTypeID( "Cpy " );

        desc28.putBoolean( idCpy, true );

        var idsaveStage = stringIDToTypeID( "saveStage" );

        var idsaveStageType = stringIDToTypeID( "saveStageType" );

        var idsaveBegin = stringIDToTypeID( "saveBegin" );

        desc28.putEnumerated( idsaveStage, idsaveStageType, idsaveBegin );

    executeAction( idsave, desc28, DialogModes.NO );

    }

2 replies

Participant
August 27, 2016

Would anybody be able to help me script this using JavaScript or other popular script language? I feel like it should be pretty simple to achieve.

To a currently open document in Photoshop

repeat n times:

     Trigger my action

     Save an incrementally named image

So that I end up with an image sequence where the action has been applied again as many times as there are images.

Thanks

Chuck Uebele
Community Expert
Chuck UebeleCommunity ExpertCorrect answer
Community Expert
August 27, 2016

One of the things you can do with javascript that you can't do with applescript is to use the scriptlistener plugin. This plugin is put into the photoshop plugins folder, and when it's there (you don't want to leave it there all the time) it will record pretty much everything you do, much like an action, but it will generate code to a log file on your desktop. I used it for recording running an action and for saving the png. Those parts of the code are in the functions in the script. So I just established a base folder name, a base file name, and a starting counter. The script will then run your action and save a png to that base folder and change the base file name by the counter increasing by one each time. You need to put in the name of your action and the name of the action set into the script.

#target photoshop

var fileName = 'myFile-';

var folderPath = new Folder (Folder.desktop +'/action test/')//create whatever path you want here. Make sure the folder exists!

var doc = activeDocument;

var counter = 1//counter for changing the filename

for (var i=0;i<4;i++){//Change number 4 to whatever number you want it to repeat + 1

    runMyAction ("twirl", "Chuck");//put in action name and action set name. This line can be duplicated for different actions.

    savePNG ()

    counter++

    }

function runMyAction(myAction, myActionSet){

    var idPly = charIDToTypeID( "Ply " );

        var desc25 = new ActionDescriptor();

        var idnull = charIDToTypeID( "null" );

            var ref8 = new ActionReference();

            var idActn = charIDToTypeID( "Actn" );

            ref8.putName( idActn, myAction );//changed to a variable

            var idASet = charIDToTypeID( "ASet" );

            ref8.putName( idASet, myActionSet );//Changed to a variable

        desc25.putReference( idnull, ref8 );

    executeAction( idPly, desc25, DialogModes.NO );

    }

function savePNG(){

    var idsave = charIDToTypeID( "save" );

        var desc28 = new ActionDescriptor();

        var idAs = charIDToTypeID( "As  " );

            var desc29 = new ActionDescriptor();

            var idPGIT = charIDToTypeID( "PGIT" );

            var idPGIT = charIDToTypeID( "PGIT" );

            var idPGIN = charIDToTypeID( "PGIN" );

            desc29.putEnumerated( idPGIT, idPGIT, idPGIN );

            var idPNGf = charIDToTypeID( "PNGf" );

            var idPNGf = charIDToTypeID( "PNGf" );

            var idPGAd = charIDToTypeID( "PGAd" );

            desc29.putEnumerated( idPNGf, idPNGf, idPGAd );

            var idCmpr = charIDToTypeID( "Cmpr" );

            desc29.putInteger( idCmpr, 9 );

        var idPNGF = charIDToTypeID( "PNGF" );

        desc28.putObject( idAs, idPNGF, desc29 );

        var idIn = charIDToTypeID( "In  " );

        desc28.putPath( idIn, new File( folderPath + '/'+ fileName + counter+ ".png" ) );//set folder path and name

        var idDocI = charIDToTypeID( "DocI" );

        desc28.putInteger( idDocI, 200 );

        var idCpy = charIDToTypeID( "Cpy " );

        desc28.putBoolean( idCpy, true );

        var idsaveStage = stringIDToTypeID( "saveStage" );

        var idsaveStageType = stringIDToTypeID( "saveStageType" );

        var idsaveBegin = stringIDToTypeID( "saveBegin" );

        desc28.putEnumerated( idsaveStage, idsaveStageType, idsaveBegin );

    executeAction( idsave, desc28, DialogModes.NO );

    }

Participant
August 27, 2016

Thank you Chuck! Works beautifully, and very nice tip about the scriptlistener plugin!

Chuck Uebele
Community Expert
Community Expert
August 24, 2016

If you don't know much about scripting, I would use javascript rather than applescript, as it's cross platform and most people here on the forum know javascript better or only - like me - and can then help you. Saving a file in javascript, and i'm assuming applescript boils down to setting up a variable for the file name and doing a saveas, incriminating the file name by some number in a loop.

Participant
August 25, 2016

Thanks for the reply, maybe that's my solution but I'd have no idea how to script that. To me the AppleScript syntax seemed like a much more friendly approach for a complete beginner.