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>