Created
August 10, 2025 11:33
-
-
Save florinel-chis/b6067f28e4104e64b068f9c288c251a8 to your computer and use it in GitHub Desktop.
Export graphics from a PSD file to be used as assets
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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