Note that there are some explanatory texts on larger screens.

plurals
  1. POPhotoshop Javascript for resize based on filesize
    text
    copied!<p>I have a folder with a <em>lot</em> of subfolders, each with a bunch of TIFs and PSD files inside. Some of these have transparency in them while some don't. These files vary massively in size.</p> <p>I need all the files to be turned into JPGs, or if they contain transparency, PNGs. I require the files to be 200kb or less and don't really mind how large they are as long as they aren't scaled up.</p> <p>Someone on a forum (who I'm insanely thankful for) wrote a fair bit of code for it, which my friend modified to suit exactly what I was asking and we're nearly there now. </p> <p>It worked fine, the only problem being that a lot of images came out 1x1 pixel and a solid block of colour.</p> <p>We've found this was consistently happening with the same images for some reason, but couldn't work out what exactly it was in these images.</p> <p>Now Mr forum blokey ( <a href="http://www.photoshopgurus.com/forum/members/paul-mr.html" rel="nofollow">http://www.photoshopgurus.com/forum/members/paul-mr.html</a> ) modified the script and it now seems to work fine with PSDs.</p> <p>It's working with TIFs with transparency but some of the TIFs with 100% opacity it just won't work on. I can't find much that's consistent with these files other than the colour blue, though this just could be a massive coincidence and probably is (there's a lot of blue in the images I've been dealing with).</p> <p>Below is a link to the thread in which the code was first written. Paul MR seems to think the colorsampler bit is a little suspect so perhaps that's what's causing the problems (blueness?).</p> <p><a href="http://www.photoshopgurus.com/forum/photoshop-actions-automation/34745-batching-tiffs-jpg-png-w-automatic-resize-based-filesize.html" rel="nofollow">http://www.photoshopgurus.com/forum/photoshop-actions-automation/34745-batching-tiffs-jpg-png-w-automatic-resize-based-filesize.html</a></p> <p>I wish I could do a little more to try and work this out myself but I've barely a speck of understanding on this stuff, I just know when there's a situation where a bit of scripting could help out.</p> <p>Below is the script as it currently stands:</p> <pre><code>#target PhotoshopString.prototype.endsWith = function(str) { return (this.match(str + "$") == str) } String.prototype.startsWith = function(str) { return this.indexOf(str) == 0; }; var desiredFileSize = 200000; app.bringToFront(); app.displayDialogs = DialogModes.NO; main(); //app.displayDialogs = DialogModes.YES; function main() { var topLevelFolder = Folder.selectDialog("Please select top level folder."); if (topLevelFolder == null)return; var FileList = []; getFileList(topLevelFolder); var startRulerUnits = app.preferences.rulerUnits; app.preferences.rulerUnits = Units.PIXELS; for (var f in FileList) { app.open(FileList[f]); activeDocument.changeMode(ChangeMode.RGB); try { activeDocument.mergeVisibleLayers(); } catch(e) {} var Name = decodeURI(app.activeDocument.name).replace(/.[^.] + $ /, ''); if (hasTransparency(FileList[f])) { var saveFile = File(FileList[f].path + "/" + Name + ".png"); SavePNG(saveFile); app.activeDocument.close(SaveOptions.DONOTSAVECHANGES); } else { var saveFile = File(FileList[f].path + "/" + Name + ".jpg"); SaveForWeb(saveFile, 80); app.activeDocument.close(SaveOptions.DONOTSAVECHANGES); } app.preferences.rulerUnits = startRulerUnits; } function getFileList(folder) { var fileList = folder.getFiles(); for (var i = 0; i &lt; fileList.length; i++) { var file = fileList[i]; if (file instanceof Folder) { getFileList(file); } else { if ((file.name.endsWith("tiff") || file.name.endsWith("tif") || file.name.endsWith("psd")) &amp;&amp; ! file.name.startsWith("._"))FileList.push(file); } } } alert(FileList.length + " files have been modified."); } function hasTransparency(file) { if (file.name.endsWith("tiff") || file.name.endsWith("tif")) { var sample = app.activeDocument.colorSamplers.add([new UnitValue(1.5, 'px'), new UnitValue(1.5, 'px')]); try { sample.color.rgb.hexValue; sample.remove(); return false; } catch(e) { sample.remove(); return true; } } var doc = activeDocument; if (doc.activeLayer.isBackgroundLayer)return false; var desc = new ActionDescriptor(); var ref = new ActionReference(); ref.putProperty(charIDToTypeID("Chnl"), charIDToTypeID("fsel")); desc.putReference(charIDToTypeID("null"), ref); var ref1 = new ActionReference(); ref1.putEnumerated(charIDToTypeID("Chnl"), charIDToTypeID("Chnl"), charIDToTypeID("Trsp")); desc.putReference(charIDToTypeID("T "), ref1); executeAction(charIDToTypeID("setd"), desc, DialogModes.NO); var w = doc.width.as('px'); var h = doc.height.as('px'); var transChannel = doc.channels.add(); doc.selection.store(transChannel); if (transChannel.histogram[255] != (h * w)) { transChannel.remove(); return true; } else { transChannel.remove(); return false; } }; function SavePNG(saveFile) { pngSaveOptions = new PNGSaveOptions(); activeDocument.saveAs(saveFile, pngSaveOptions, true, Extension.LOWERCASE); var actualFilesize = saveFile.length; var ratio = desiredFileSize / actualFilesize; if (ratio &lt; 1) { var imageScale = Math.sqrt(ratio); activeDocument.resizeImage(activeDocument.width * imageScale, activeDocument.height * imageScale, activeDocument.resolution, ResampleMethod.BICUBICSMOOTHER); activeDocument.saveAs(saveFile, pngSaveOptions, true, Extension.LOWERCASE); } } function SaveForWeb(saveFile, jpegQuality) { var sfwOptions = new ExportOptionsSaveForWeb(); sfwOptions.format = SaveDocumentType.JPEG; sfwOptions.includeProfile = false; sfwOptions.interlaced = 0; sfwOptions.optimized = true; sfwOptions.quality = jpegQuality; activeDocument.exportDocument(saveFile, ExportType.SAVEFORWEB, sfwOptions); var actualFilesize = saveFile.length; var ratio = desiredFileSize / actualFilesize; if (ratio &lt; 1) { var imageScale = Math.sqrt(ratio); activeDocument.resizeImage(activeDocument.width * imageScale, activeDocument.height * imageScale, activeDocument.resolution, ResampleMethod.BICUBICSMOOTHER); activeDocument.exportDocument(saveFile, ExportType.SAVEFORWEB, sfwOptions); } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload