Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
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);
}

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!

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++;
}

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

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);
    }
  }
}
...

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

iHRSd commented Dec 2, 2015

Nice, Thanks a lot

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 commented May 6, 2016

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

notmrg commented Mar 31, 2017

I just stumbled across tinypng and within 10 minutes found this page. The combination of the two is going to save me HOURS and HOURS. Thank you so much!!

Is it possible to include JPG files in the process? at the moment it seems to affect only PNG files.
If the script runs into an error with opening a file, it stops completely. is it possible to skip the files that give an error?

dirango commented May 30, 2017

This script is definitely a life saver!

How do I get it to compress files in subfolders within subfolders? Right now I think it's only looking for files in subfolders and not checking if there are folders within the subfolders.

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