I would like a simple and quick way to save a copy of an image in Photoshop, with an auto-incrementing filename. Ideally, a single button to capture a frame in a stop motion animation. In other words, I would like to save a copy of the working image as a JPEG without any interactive prompts and the filename will automatically increment a count.
For example, if I’m working with a file “test.psd”, I want a single action that will save a copy “test_0001.jpg”, and subsequent calls will save “test_0002.jpg”, “test_0003.jpg”, and so on.
By default, Photoshop will overwrite existing files, and it would be quite tedious to manually “Save As” for hundreds or thousands of images. Fortunately, Photoshop offers a scripting interface to call user defined scripts. Custom scripts can even be loaded into Photoshop and executed as an Action.
The following snippet can be saved as [Photoshop Directory]/Presets/Scripts/saveFrame.jsx, and after restarting Photoshop you should see “saveFrame” under File -> Scripts.
main(); /*** * Scripted "save as" with incrementing filename * e.g., test_0001.jpg, test_0002.jpg, ... * ***/ function main() { if (!documents.length) return; cnt = 1; try { var Name = decodeURI(activeDocument.name).replace(/\.[^\.]+$/, ''); var Path = decodeURI(activeDocument.path); var saveFrame = Path + "/" + Name + "_" + zeroPad(cnt,4) + ".jpg"; // // find the next available filename while ( File(saveFrame).exists ) { cnt++; saveFrame = Path + "/" + Name + "_" + zeroPad(cnt,4) + ".jpg"; } // // save as, change the default JPEG quality here as needed SaveJPEG(File(saveFrame), 9); } catch(e) { alert(e + "\r@ Line " + e.line); } } function SaveJPEG(saveFile, jpegQuality) { var doc = activeDocument; if (doc.bitsPerChannel != BitsPerChannelType.EIGHT) doc.bitsPerChannel = BitsPerChannelType.EIGHT; jpgSaveOptions = new JPEGSaveOptions(); jpgSaveOptions.embedColorProfile = true; jpgSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE; jpgSaveOptions.matte = MatteType.NONE; jpgSaveOptions.quality = jpegQuality; activeDocument.saveAs(saveFile, jpgSaveOptions, true, Extension.LOWERCASE); } function zeroPad(n, s) { n = n.toString(); while (n.length < s) n = '0' + n; return n; };
Using Photoshop scripts you can automate any task and even create animation effects. In CS6 you can render a series of images as a video, alternatively, you can create the image frames in Photoshop and use ffmpeg to render the video.
If you want to use ffmpeg to render a series of images, you could use the following command,
$ ffmpeg -r 30 -f image2 -i test_%04d.jpg -vb 1M -r 30 test.webm
Here is a simple (90 frame loop) example animating a series of scripted lighting effects,
The above video is embedded in this page using the following html,
<video id="test_test" poster="test_0001.jpg" preload="auto" loop autoplay> <source src="test.mp4" type="video/mp4" /> <source src="test.webm" type="video/webm" /> <source src="test.ogv" type="video/ogg" /> <object width="600" height="360" type="application/x-shockwave-flash" data="test.swf"> <param name="movie" value="test.swf" /> <img src="test_0001.jpg" width="600" height="360" alt="test" title="No video playback" /> </object> </video>