Skip to content

Instantly share code, notes, and snippets.

@rolftimmermans
Created June 25, 2014 14:24
Show Gist options
  • Save rolftimmermans/936eb3abf99776070830 to your computer and use it in GitHub Desktop.
Save rolftimmermans/936eb3abf99776070830 to your computer and use it in GitHub Desktop.
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);
}
@boyliu2008cn
Copy link

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
Copy link

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

@morbidcamel101
Copy link

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
Copy link

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

@iHRSd
Copy link

iHRSd commented Dec 2, 2015

Nice, Thanks a lot

@mefm247
Copy link

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
Copy link

chiuan commented May 6, 2016

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

@notmrg
Copy link

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!!

@valentinilas
Copy link

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
Copy link

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.

@Seanrc
Copy link

Seanrc commented Jul 29, 2017

When I used this script last year it compressed files in subfolders within subfolders. It's no longer doing that. Maybe a change in Photoshop CC 2017 or in the TinyPNG plugin itself? It runs through the files in these subfolders but does not compress them.

@Flatlinezor
Copy link

Any chance of success to have a JPG compatible version of this please?

@eurorincon
Copy link

Excelente!!! @rolftimmermans

Muchas gracias, funciona muy bien!!! 👍
lo estoy usando en Photoshop 2018 y ya tengo el plugin instalado.
nuevamente muchas gracias.

Excellent!!! @rolftimmermans
Thank you very much, it works very well !!! 👍
I'm using it in Photoshop 2018 and I already have the plugin installed.
again thank you very much.

@guchokipa
Copy link

guchokipa commented Dec 1, 2018

Thank you so much for this small but great script.
I modified slightly to suit my requirements such as

1)included jpg
'''
if (child.name.slice(-4).toLowerCase() == ".png" || child.name.slice(-4).toLowerCase() == ".jpg") {
'''

2)thks for Otto's modification to escape from termination but I didn't want to stop the process even with an alart window so commented out the alert

3)message window to confirm the process finished
'''
alert("FINISHED");
'''

All worked well with my CS6 , 6000+consecutive files & sub-folders

@ogland
Copy link

ogland commented May 21, 2019

This is great but it crashes both photoshop 2018 and 2019 when attempting to compress JPEG. Any chances for a updated script?

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