Skip to content

Instantly share code, notes, and snippets.

@florinel-chis
Created August 10, 2025 11:33
Show Gist options
  • Save florinel-chis/b6067f28e4104e64b068f9c288c251a8 to your computer and use it in GitHub Desktop.
Save florinel-chis/b6067f28e4104e64b068f9c288c251a8 to your computer and use it in GitHub Desktop.
Export graphics from a PSD file to be used as assets
#target photoshop
// =========================
// CONFIG
// =========================
var MIN_PIXEL_AREA = 100; // skip very small/empty layers
var EXPORT_FORMAT = "PNG"; // can be "PNG" or "JPG"
// =========================
function main() {
if (!app.documents.length) {
alert("No document is open.");
return;
}
var doc = app.activeDocument;
var outFolder = Folder.selectDialog("Select output folder for assets");
if (!outFolder) return;
var initialRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
traverseLayers(doc, outFolder);
app.preferences.rulerUnits = initialRulerUnits;
alert("Export complete!");
}
function traverseLayers(container, outFolder) {
for (var i = 0; i < container.layers.length; i++) {
var layer = container.layers[i];
if (!layer.visible) continue;
if (layer.kind === LayerKind.TEXT) continue;
if (layer.typename === "ArtLayer") {
exportLayer(layer, outFolder);
}
else if (layer.typename === "LayerSet") {
// Export the group itself
exportLayer(layer, outFolder);
// Recursively scan sublayers
traverseLayers(layer, outFolder);
}
}
}
function exportLayer(layer, outFolder) {
// Duplicate to new doc
var doc = app.activeDocument;
var dupDoc = app.documents.add(doc.width, doc.height, doc.resolution, "Temp", NewDocumentMode.RGB, DocumentFill.TRANSPARENT);
app.activeDocument = doc;
layer.duplicate(dupDoc, ElementPlacement.PLACEATBEGINNING);
app.activeDocument = dupDoc;
// Merge visible to flatten everything into one layer
dupDoc.mergeVisibleLayers();
// Trim transparent pixels
dupDoc.trim(TrimType.TRANSPARENT, true, true, true, true);
// Check size (skip tiny/empty)
var w = dupDoc.width.as("px");
var h = dupDoc.height.as("px");
if (w * h < MIN_PIXEL_AREA) {
dupDoc.close(SaveOptions.DONOTSAVECHANGES);
app.activeDocument = doc;
return;
}
// Build safe filename
var safeName = layer.name.replace(/[\\\/\:\*\?\"\<\>\|]/g, "_");
var saveFile = new File(outFolder + "/" + safeName + "." + EXPORT_FORMAT.toLowerCase());
// Save
if (EXPORT_FORMAT === "PNG") {
var opts = new PNGSaveOptions();
opts.interlaced = false;
dupDoc.saveAs(saveFile, opts, true, Extension.LOWERCASE);
} else if (EXPORT_FORMAT === "JPG") {
var jpgOpts = new JPEGSaveOptions();
jpgOpts.quality = 12;
dupDoc.saveAs(saveFile, jpgOpts, true, Extension.LOWERCASE);
}
dupDoc.close(SaveOptions.DONOTSAVECHANGES);
app.activeDocument = doc;
}
main();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment