Create a gist now

Instantly share code, notes, and snippets.

Compressing all PNG images in a folder and its subfolders with TinyPNG
#target photoshop
/* Open the given file, and compress with TinyPNG. */
function compressFile(file) {
var document = open(file);
if (document.mode == DocumentMode.INDEXEDCOLOR) {
document.changeMode(ChangeMode.RGB);
}
var tinypng = new ActionDescriptor();
tinypng.putPath(charIDToTypeID("In "), file); /* Overwrite original! */
var compress = new ActionDescriptor();
compress.putObject(charIDToTypeID("Usng"), charIDToTypeID("tinY"), tinypng);
executeAction(charIDToTypeID("Expr"), compress, DialogModes.NO);
document.close(SaveOptions.DONOTSAVECHANGES);
}
/* Recursively compress files in the given folder, overwriting the originals. */
function compressFolder(folder) {
var children = folder.getFiles();
for (var i = 0; i < children.length; i++) {
var child = children[i];
if (child instanceof Folder) {
compressFolder(child);
} else {
/* Only attempt to compress PNG files. */
if (child.name.slice(-4).toLowerCase() == ".png") {
compressFile(child);
}
}
}
}
try {
compressFolder(Folder.selectDialog("Compress folder with TinyPNG"));
} catch(error) {
alert("Error while processing: " + error);
}
@LDigital84

Awesome! Thank you for sharing this, quick and easy way to use TinyPNG in Photoshop to easily batch files. Any way to add a report at the end that will list the number of files processed and by how much all the files were reduced by? (This could be a cumulative total vs listing each file.) For example a report could like this:

45 Files Processed
Reduced by 80% 
Total Saved: 800kb

Or something like that.

Thank You Again!

@boyliu2008cn

Thanks for sharing!
In order to skip a non PNG file,add "else" in judging the PNG file

If (child.name.slice(-4).toLowerCase) = = ".png") {
compressFile (child);
}else {
i++;
}

@boyliu2008cn

And this jsx is not support the chinese folder name,can fix it?

@JohanOtto

Hi All, I had one file in my entire folder structure that gave me an issue and I didn't want the whole process to stop because of one file. I did a quick and dirty try...catch so that I can go on with the rest of my files and also know which file was the culprit.

...
/* Recursively compress files in the given folder, overwriting the originals. */
function compressFolder(folder) {
  var children = folder.getFiles();
  for (var i = 0; i < children.length; i++) {
    var child = children[i];
    try
    {
        if (child instanceof Folder) {
          compressFolder(child);
        } else {
          /* Only attempt to compress PNG files. */
          if (child.name.slice(-4).toLowerCase() == ".png") {
            compressFile(child);
          } 
        }
    }
    catch(error)
    {
        alert("Error while processing file '"+ child.name + "'. " + error);
    }
  }
}
...
@sinnergun

Supeb !!!
but It Would be great if We can Export Layers To Files through TinyPNg

@iHRSd
iHRSd commented Dec 2, 2015

Nice, Thanks a lot

@mefm247
mefm247 commented Jan 30, 2016

Great stuff mate, just a quick heads up, looks like this guy copied your code and gave no attribution:

https://github.com/lukaMis/adobeCCScripts

http://www.lukamis.com/2014/11/11/tinypng-javascript-automator/

Ps: What charIDToTypeID would I need for JPGs?

@chiuan
chiuan commented May 6, 2016

hello. can i using this jsx in command line?
and how can i use command line args??

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment