I can't test it properly now due to errors reported in later versions that were not triggered back in the earlier versions of Photoshop. I think that the code needs a major overhaul and rewrite adding various options in a single script interface.
By @Stephen Marsh
I have rewritten the script. This v2.0 is the basic framework which I will use to add a custom interface in the next release.
It has not had exhaustive testing with complex artboards. This new ground-up rewrite uses different processing for the artboards (no longer based on smart objects), so we'll need to see how the results are with feedback from diverse users and use cases. It should be faster than the previous scripts.
This version does not offer 200% sizing or JPEG options, but they are easy enough to transplant if needed.
The next 2.1 version will offer these and other features.
/*
Artboards-to-WEBP-PS2025-v2.jsx
22nd July 2025, v2.0 - Stephen Marsh
https://community.adobe.com/t5/photoshop-ecosystem-discussions/exporting-artboards-to-webp-format/td-p/12937135
* Artboard processing rewritten from the original v1.0-1.9 scripts to avoid errors in later versions of Photoshop
* Only for Photoshop 2022 (v23.x.x) or later!
* Saves artboards as lossy WebP, quality: 75
* Select a save location and prefix + separator to be added to the artboard name (uses the doc name by default)
* Filename word spaces (%20) are converted to web-friendly hyphens
* Existing files will be silently overwritten
* Converts non-RGB mode to sRGB color space, RGB color mode and 8 bpc
* If RGB mode, the original color space is retained - beware if using wide gamut spaces such as ProPhoto RGB!
* Artboard content is constrained to the artboard bounds
* Metadata is removed and the document ICC profile is embedded
* Output directory automatically opened
*/
#target photoshop
(function () {
try {
app.bringToFront();
// Ensure that version 2022 or later is being used
var versionNumber = app.version.split(".");
var versionCheck = parseInt(versionNumber);
if (versionCheck < 23) {
alert("You must use Photoshop 2022 or later to save using native WebP format...");
return;
}
// Ensure a document is open
if (app.documents.length === 0) {
alert("Please open a document first!");
return;
}
// Ensure that the doc has an artboard
if (!hasArtboards()) {
alert("No artboards found, script canceled!");
return;
}
// Get the path of the active document (only if it's saved)
var defaultPath = (app.activeDocument && app.activeDocument.fullName)
? app.activeDocument.fullName.parent : Folder("~/Desktop");
var outputFolder = Folder.selectDialog(
"Select an output folder to save the artboards as WebP:",
defaultPath
);
if (outputFolder === null) {
app.beep();
return;
}
var doc = app.activeDocument;
var layerSets = doc.layerSets;
// Create a ScriptUI dialog to get the prefix
var dlg = new Window("dialog", "Enter Prefix");
dlg.orientation = "column";
dlg.alignChildren = ["fill", "top"];
dlg.spacing = 10;
dlg.margins = 16;
var defaultPrefix = doc.name.replace(/\.[^\.]+$/, '').replace(/ /g, '-') + "_";
dlg.add("statictext", undefined, "Add the prefix including separator character to the artboard name:");
var input = dlg.add("edittext", undefined, defaultPrefix);
input.characters = 40;
input.active = true;
var btnGroup = dlg.add("group"); // OK and Cancel buttons
btnGroup.alignment = "right";
var okBtn = btnGroup.add("button", undefined, "OK");
var cancelBtn = btnGroup.add("button", undefined, "Cancel");
var preFix; // Result handling
okBtn.onClick = function () {
preFix = input.text;
dlg.close(1);
};
cancelBtn.onClick = function () {
dlg.close(0);
};
if (dlg.show() !== 1) {
app.beep();
return;
}
// Hide the Photoshop panels
app.togglePalettes();
// Create the progress bar window
var progressWin = new Window("palette", "Processing Artboards", undefined, { closeButton: false });
progressWin.orientation = "column";
progressWin.alignChildren = ["fill", "top"];
progressWin.spacing = 10;
progressWin.margins = 16;
var progressText = progressWin.add("statictext", undefined, "Starting...");
var progressBar = progressWin.add("progressbar", undefined, 0, layerSets.length);
progressBar.preferredSize = [300, 20];
progressWin.show();
doc.duplicate(doc.name.replace(/\.[^\.]+$/, '').replace(/ /g, '-'), false);
// If the doc isn't in RGB mode
if (activeDocument.mode !== DocumentMode.RGB)
// Convert to sRGB
activeDocument.convertProfile("sRGB IEC61966-2.1", Intent.RELATIVECOLORIMETRIC, true, false);
// Ensure that the doc mode is RGB (to correctly handle Indexed Color mode)
activeDocument.changeMode(ChangeMode.RGB);
activeDocument.bitsPerChannel = BitsPerChannelType.EIGHT;
// Clean out unwanted metadata
deleteDocumentAncestorsMetadata();
removeCRSmeta();
var dupedDoc = app.activeDocument;
var dupedDoclayerSets = app.activeDocument.layerSets;
var fileCounter = 0;
// Process the artboards
for (var i = dupedDoclayerSets.length - 1; i >= 0; i--) {
var currentSet = dupedDoclayerSets[i];
// Select the layerSet
dupedDoc.activeLayer = currentSet;
// Update progress bar window
progressText.text = "Processing: " + currentSet.name + " (" + (fileCounter + 1) + " of " + layerSets.length + ")";
progressBar.value = fileCounter + 1;
app.refresh();
// Conditionally process artboards - not layerSets or frames
if (isArtboard() === true) {
// Dupe artboard to new doc
dupeActiveLayer(currentSet.name, currentSet.name);
trimTransparency(true, true, true, true);
// Combine the prefix with the filename, RegEx replace illegal filename characters with a hyphen
var artboardName = preFix + app.activeDocument.activeLayer.name.replace(/[:\/\\*\?\"\<\>\|\\\r\\\n. ]/g, "-");
saveAsWebP(artboardName);
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
fileCounter++;
}
}
dupedDoc.close(SaveOptions.DONOTSAVECHANGES);
// Ensure Photoshop has focus before closing the progress bar window
app.bringToFront();
progressWin.close();
// Restore the Photoshop panels
app.togglePalettes();
// End of script notification
app.beep();
alert(fileCounter + ' WebP files saved to: ' + '\r' + outputFolder.fsName);
// Open the output folder in Windows Explorer or the Mac Finder
outputFolder.execute();
///// FUNCTIONS /////
function hasArtboards() {
try {
for (var i = 0; i < activeDocument.layerSets.length; i++) {
activeDocument.activeLayer = activeDocument.layerSets[i];
var r = new ActionReference();
r.putEnumerated(stringIDToTypeID('layer'), stringIDToTypeID('ordinal'), stringIDToTypeID('targetEnum'));
var options = executeActionGet(r);
if (options.hasKey(stringIDToTypeID('artboard'))) return true;
}
return false;
} catch (e) {
alert("Error:\n" + e.message + "\nLine: " + e.line);
}
}
function isArtboard() {
try {
var d = new ActionDescriptor();
var r = new ActionReference();
r.putEnumerated(stringIDToTypeID('layer'), stringIDToTypeID('ordinal'), stringIDToTypeID('targetEnum'));
var options = executeActionGet(r);
return options.hasKey(stringIDToTypeID('artboard'));
} catch (e) {
alert("Error:\n" + e.message + "\nLine: " + e.line);
}
}
function dupeActiveLayer(docName, layerName) {
try {
var c2t = function (s) {
return app.charIDToTypeID(s);
};
var s2t = function (s) {
return app.stringIDToTypeID(s);
};
var descriptor = new ActionDescriptor();
var reference = new ActionReference();
var reference2 = new ActionReference();
reference.putClass(s2t("document"));
descriptor.putReference(c2t("null"), reference);
descriptor.putString(s2t("name"), docName); // Doc name
reference2.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
descriptor.putReference(s2t("using"), reference2);
descriptor.putString(s2t("layerName"), layerName); // Layer name
executeAction(s2t("make"), descriptor, DialogModes.NO);
} catch (e) {
alert("Error:\n" + e.message + "\nLine: " + e.line);
}
}
function trimTransparency(top, bottom, left, right) {
try {
var c2t = function (s) {
return app.charIDToTypeID(s);
};
var s2t = function (s) {
return app.stringIDToTypeID(s);
};
var descriptor = new ActionDescriptor();
descriptor.putEnumerated(s2t("trimBasedOn"), s2t("trimBasedOn"), c2t("Trns"));
descriptor.putBoolean(s2t("top"), top);
descriptor.putBoolean(s2t("bottom"), bottom);
descriptor.putBoolean(s2t("left"), left);
descriptor.putBoolean(s2t("right"), right);
executeAction(s2t("trim"), descriptor, DialogModes.NO);
} catch (e) {
alert("Error:\n" + e.message + "\nLine: " + e.line);
}
}
function removeCRSmeta() {
try {
if (!documents.length) return;
if (ExternalObject.AdobeXMPScript === undefined) ExternalObject.AdobeXMPScript = new ExternalObject("lib:AdobeXMPScript");
var xmp = new XMPMeta(app.activeDocument.xmpMetadata.rawData);
XMPUtils.removeProperties(xmp, XMPConst.NS_CAMERA_RAW, "", XMPConst.REMOVE_ALL_PROPERTIES);
app.activeDocument.xmpMetadata.rawData = xmp.serialize();
} catch (e) {
alert("Error:\n" + e.message + "\nLine: " + e.line);
}
}
function deleteDocumentAncestorsMetadata() {
try {
whatApp = String(app.name);
if (whatApp.search("Photoshop") > 0) {
if (ExternalObject.AdobeXMPScript === undefined) ExternalObject.AdobeXMPScript = new ExternalObject("lib:AdobeXMPScript");
var xmp = new XMPMeta(activeDocument.xmpMetadata.rawData);
xmp.deleteProperty(XMPConst.NS_PHOTOSHOP, "DocumentAncestors");
app.activeDocument.xmpMetadata.rawData = xmp.serialize();
}
} catch (e) {
alert("Error:\n" + e.message + "\nLine: " + e.line);
}
}
function saveAsWebP(saveName) {
try {
var s2t = function (s) {
return app.stringIDToTypeID(s);
};
var descriptor = new ActionDescriptor();
var descriptor2 = new ActionDescriptor();
descriptor2.putEnumerated(s2t("compression"), s2t("WebPCompression"), s2t("compressionLossy"));
descriptor2.putInteger(s2t("quality"), 75);
descriptor2.putBoolean(s2t("includeXMPData"), false);
descriptor2.putBoolean(s2t("includeEXIFData"), false);
descriptor2.putBoolean(s2t("includePsExtras"), false);
descriptor.putObject(s2t("as"), s2t("WebPFormat"), descriptor2);
descriptor.putPath(s2t("in"), new File(outputFolder + '/' + saveName + '.webp'), true);
descriptor.putBoolean(s2t("lowerCase"), true);
descriptor.putEnumerated(s2t("saveStage"), s2t("saveStageType"), s2t("saveSucceeded"));
executeAction(s2t("save"), descriptor, DialogModes.NO);
} catch (e) {
alert("Error:\n" + e.message + "\nLine: " + e.line);
}
}
} catch (e) {
alert("Error:\n" + e.message + "\nLine: " + e.line);
}
})();
Here is the 2.1 script version:

* Batch Output to WebP - Automatically saves all your artboards to WebP format in one go, saving you from the tedious process of saving each artboard individually
* Dual Format Support - Can export both WebP and JPEG versions simultaneously, so you get modern WebP files for performance plus JPEG fallbacks for compatibility
* Flexible Compression Options - Choose between lossy and lossless WebP compression with a quality slider (0-100), giving you control over file size vs. image quality
* Batch Resizing - Resize all artboards by percentage in one operation, perfect for creating multiple asset sizes for responsive designs or different screen densities
* Automatic File Management - Handles filename sanitization, removes special characters, and can optionally add timestamps to prevent overwriting existing files
* Color Profile Optimization - Automatically converts non-RGB files to sRGB color space. Optionally convert RGB mode files to sRGB
* Metadata Cleanup - Strips out metadata, to keep file sizes as small as possible
/*
Artboards-to-WEBP-PS2025-scriptUI-GUI-v2-2.jsx
30th July 2025, v2.2 - Stephen Marsh
https://community.adobe.com/t5/photoshop-ecosystem-discussions/exporting-artboards-to-webp-format/td-p/12937135
* Artboard processing rewritten from the original v1.0-1.9 scripts to avoid errors in later versions of Photoshop
* Only for Photoshop 2022 (v23.x.x) or later!
* Saves artboards as WebP with lossless/lossy quality options
* Resize artboard by % option, a filename suffix such as '_200' is added to indicate a 200% resize
* Filename word spaces (%20) are converted to web-friendly hyphens
* Artboard content is constrained to the artboard bounds
* Metadata is removed and the document ICC profile is embedded
* Optional JPEG save checkbox with quality level dropdown menu
* Option to overwrite existing files or to add a date-timestamp suffix '_YYYYMMDD-HHMMSS'
* Optionally convert RGB images to sRGB color profile, RGB color mode and 8 bpc (non-RGB images are automatically converted to sRGB 8 BPC)
*/
#target photoshop
(function () {
try {
app.bringToFront();
var versionNumber = app.version.split(".");
var versionCheck = parseInt(versionNumber);
if (versionCheck < 23) {
alert("You must use Photoshop 2022 or later to save using native WebP format...");
return;
}
if (app.documents.length === 0) {
alert("Please open a document first!");
return;
}
var doc = app.activeDocument;
var layerSets = doc.layerSets;
try {
// var docPath = decodeURI(app.activeDocument.path);
var docPath = app.activeDocument.path;
} catch (e) {
docPath = Folder("~/Desktop");
}
if (!hasArtboards()) {
alert("No artboards found, script canceled!");
return;
}
// ScriptUI settings dialog defaults
var exportSettings = {
outputFolder: docPath,
prefix: doc.name.replace(/\.[^\.]+$/, '').replace(/ /g, '-') + "_",
quality: 75,
isLossy: true,
overwrite: true,
openFolder: true,
enableResize: false,
resizeWidth: 200,
scaleStyles: true,
constrainProportions: true,
jpegQuality: 9,
saveJPEG: true
};
var dlg = new Window("dialog", "Export Artboards to WebP (v2.2)");
dlg.orientation = "column";
dlg.alignChildren = ["fill", "top"];
dlg.spacing = 10;
dlg.margins = 16;
var settingsGroup = dlg.add("panel", undefined, ""); // Possibly add an "Export Options" label
settingsGroup.orientation = "column";
settingsGroup.alignChildren = ["fill", "top"];
settingsGroup.margins = 10;
settingsGroup.spacing = 8;
var folderGroup = settingsGroup.add("group");
folderGroup.orientation = "column";
folderGroup.alignChildren = ["fill", "top"];
folderGroup.add("statictext", undefined, "Output folder:");
var folderSubGroup = folderGroup.add("group");
var browseBtn = folderSubGroup.add("button", undefined, "Browse...");
var folderText = folderSubGroup.add("statictext", undefined, exportSettings.outputFolder ? decodeURI(exportSettings.outputFolder.fsName) : "None selected", { truncate: 'middle' });
folderText.alignment = ["fill", "left"];
browseBtn.onClick = function () {
var folder = Folder.selectDialog("Select Output Folder");
if (folder) {
exportSettings.outputFolder = folder;
folderText.text = decodeURI(folder.fsName);
}
};
var prefixGroup = settingsGroup.add("group");
prefixGroup.orientation = "column";
prefixGroup.alignChildren = ["fill", "top"];
prefixGroup.add("statictext", undefined, "Filename prefix:");
var prefixInput = prefixGroup.add("edittext", undefined, exportSettings.prefix);
prefixInput.characters = 30;
var compGroup = settingsGroup.add("group");
compGroup.orientation = "column";
compGroup.alignChildren = ["fill", "top"];
var radioGroup = compGroup.add("group");
radioGroup.orientation = "row";
radioGroup.add("statictext", undefined, "Compression:");
var lossyRadio = radioGroup.add("radiobutton", undefined, "Lossy");
var losslessRadio = radioGroup.add("radiobutton", undefined, "Lossless");
lossyRadio.value = true;
var qualityGroup = compGroup.add("group");
qualityGroup.orientation = "row";
qualityGroup.alignChildren = ["left", "center"];
qualityGroup.add("statictext", undefined, "Image quality (0-100):");
var qualitySlider = qualityGroup.add("slider", undefined, exportSettings.quality, 0, 100);
qualitySlider.preferredSize.width = 150;
var qualityValue = qualityGroup.add("statictext", undefined, exportSettings.quality.toString());
qualitySlider.onChanging = function () {
qualityValue.text = Math.round(qualitySlider.value).toString();
};
qualitySlider.onChange = function () {
qualityValue.text = Math.round(qualitySlider.value).toString();
};
lossyRadio.onClick = function () {
qualitySlider.enabled = true;
qualityValue.enabled = true;
};
losslessRadio.onClick = function () {
qualitySlider.enabled = false;
qualityValue.enabled = false;
};
var resizeGroup = settingsGroup.add("group");
resizeGroup.orientation = "column";
resizeGroup.alignChildren = ["fill", "top"];
var resizeCheck = resizeGroup.add("checkbox", undefined, "Resize artboards");
resizeCheck.value = false;
resizeCheck.helpTip = "Resize artboards, filename suffix such as '_200' added";
var resizeOptionsGroup = resizeGroup.add("group");
resizeOptionsGroup.orientation = "row";
resizeOptionsGroup.alignChildren = ["left", "center"];
resizeOptionsGroup.enabled = false;
resizeOptionsGroup.add("statictext", undefined, "Resize %:");
var widthInput = resizeOptionsGroup.add("editnumber", undefined, exportSettings.resizeWidth.toString());
widthInput.characters = 5;
resizeCheck.onClick = function () {
resizeOptionsGroup.enabled = resizeCheck.value;
};
var checkGroup = settingsGroup.add("group");
checkGroup.orientation = "column";
checkGroup.alignChildren = ["left", "top"];
var convertRGBCheck = checkGroup.add("checkbox", undefined, "Convert to sRGB");
convertRGBCheck.value = true;
convertRGBCheck.helpTip = "Converts RGB mode files which are not sRGB to sRGB";
var overwriteCheck = checkGroup.add("checkbox", undefined, "Overwrite existing files");
overwriteCheck.value = true;
overwriteCheck.helpTip = "If unchecked, will add a date-time suffix i.e. '_YYYYMMDD-HHMMSS' to avoid overwriting existing files";
var openFolderCheck = checkGroup.add("checkbox", undefined, "Open folder after export");
openFolderCheck.value = false;
var jpegGroup = checkGroup.add("group");
jpegGroup.orientation = "row";
jpegGroup.alignChildren = ["left", "center"];
var saveJPEGCheck = jpegGroup.add("checkbox", undefined, "Save JPEG copy");
saveJPEGCheck.helpTip = "Save additional JPEG versions";
saveJPEGCheck.value = false;
var jpegQualityLabel = jpegGroup.add("statictext", undefined, "Quality:");
var jpegQualityDropdown = jpegGroup.add("dropdownlist", undefined, ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]);
jpegQualityDropdown.selection = 9; // Default to "9"
jpegQualityLabel.enabled = false;
jpegQualityDropdown.enabled = false;
saveJPEGCheck.onClick = function () {
jpegQualityLabel.enabled = saveJPEGCheck.value;
jpegQualityDropdown.enabled = saveJPEGCheck.value;
};
var btnGroup = dlg.add("group");
btnGroup.alignment = "right";
var cancelBtn = btnGroup.add("button", undefined, "Cancel");
var okBtn = btnGroup.add("button", undefined, "OK");
cancelBtn.onClick = function () {
dlg.close(0);
};
okBtn.onClick = function () {
if (!exportSettings.outputFolder) {
alert("Please select an output folder.");
return;
}
exportSettings.prefix = prefixInput.text;
exportSettings.quality = Math.round(qualitySlider.value);
exportSettings.isLossy = lossyRadio.value;
exportSettings.overwrite = overwriteCheck.value;
exportSettings.openFolder = openFolderCheck.value;
exportSettings.enableResize = resizeCheck.value;
exportSettings.resizeWidth = parseInt(widthInput.text) || 100;
exportSettings.saveJPEG = saveJPEGCheck.value; // Capture JPEG checkbox value
if (saveJPEGCheck.value && jpegQualityDropdown.selection !== null) {
exportSettings.jpegQuality = parseInt(jpegQualityDropdown.selection.text);
}
exportSettings.convertRGB = convertRGBCheck.value;
dlg.close(1);
};
if (dlg.show() !== 1) {
app.beep();
return;
}
// Hide Photoshop panels
app.togglePalettes();
// Progress bar window
var progressWin = new Window("palette", "Processing Artboards", undefined, { closeButton: false });
progressWin.orientation = "column";
progressWin.alignChildren = ["fill", "top"];
progressWin.spacing = 10;
progressWin.margins = 16;
var progressText = progressWin.add("statictext", undefined, "Starting...");
var progressBar = progressWin.add("progressbar", undefined, 0, layerSets.length);
progressBar.preferredSize = [300, 20];
progressWin.show();
// Temp doc unexpected error handling
var dupedDoc = null;
try {
// Duplicate the original document
dupedDoc = doc.duplicate(doc.name.replace(/\.[^\.]+$/, '').replace(/ /g, '-'), false);
app.activeDocument = dupedDoc;
if (activeDocument.mode !== DocumentMode.RGB) {
activeDocument.convertProfile("sRGB IEC61966-2.1", Intent.RELATIVECOLORIMETRIC, true, false);
activeDocument.changeMode(ChangeMode.RGB);
} else if (exportSettings.convertRGB) {
activeDocument.convertProfile("sRGB IEC61966-2.1", Intent.RELATIVECOLORIMETRIC, true, false);
}
activeDocument.bitsPerChannel = BitsPerChannelType.EIGHT;
// These steps are redundant as each artboard is duplicated to a new doc, but it can't hurt to leave them in
deleteDocumentAncestorsMetadata();
removeCRSmeta();
removeXMP();
var dupedDoclayerSets = app.activeDocument.layerSets;
var webpCounter = 0;
var jpegCounter = 0;
for (var i = dupedDoclayerSets.length - 1; i >= 0; i--) {
var currentSet = dupedDoclayerSets[i];
dupedDoc.activeLayer = currentSet;
progressText.text = "Processing: " + currentSet.name + " (" + (webpCounter + 1) + " of " + layerSets.length + ")";
progressBar.value = webpCounter + 1;
app.refresh();
if (isArtboard() === true) {
dupeActiveLayer(currentSet.name, currentSet.name);
trimTransparency(true, true, true, true);
if (exportSettings.enableResize && exportSettings.resizeWidth !== 100) {
imageSize(exportSettings.resizeWidth, exportSettings.scaleStyles, exportSettings.constrainProportions);
}
artboardName = exportSettings.prefix + app.activeDocument.activeLayer.name
.replace(/[:\/\\*\?\"\<\>\|\\\r\\\n. ]+/g, "-")
.replace(/-+$/, '')
.replace(/^-+/, '');
if (exportSettings.enableResize) {
artboardName += "_" + exportSettings.resizeWidth.toString();
}
var finalFileName = artboardName;
if (!exportSettings.overwrite) {
finalFileName = artboardName + "_" + getTimestamp();
}
saveAsWebP(finalFileName);
if (exportSettings.saveJPEG) {
saveAsJPEG(finalFileName);
jpegCounter++;
}
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
webpCounter++;
}
}
// v2.2 revision, mistakenly missed from the original release!
dupedDoc.close(SaveOptions.DONOTSAVECHANGES);
} catch (e) {
alert("Unexpected error during processing:\n" + e.message + "\nLine: " + e.line);
} finally {
try {
if (dupedDoc && app.documents.length && app.documents.indexOf(dupedDoc) !== -1) {
dupedDoc.close(SaveOptions.DONOTSAVECHANGES);
}
} catch (e) {}
app.bringToFront();
progressWin.close();
app.togglePalettes();
}
// End of script notification
app.togglePalettes();
app.beep();
var fileCounter = webpCounter + jpegCounter;
alert(fileCounter + ' files saved to: ' + '\r' + exportSettings.outputFolder.fsName);
// Open folder in Finder or Explorer conditional for checkbox
if (exportSettings.openFolder) {
exportSettings.outputFolder.execute();
}
////// FUNCTIONS //////
function imageSize(width, scaleStyles, constrainProportions) {
try {
var s2t = function (s) {
return app.stringIDToTypeID(s);
};
var descriptor = new ActionDescriptor();
descriptor.putUnitDouble(s2t("width"), s2t("percentUnit"), width);
descriptor.putBoolean(s2t("scaleStyles"), scaleStyles);
descriptor.putBoolean(s2t("constrainProportions"), constrainProportions);
descriptor.putEnumerated(s2t("interfaceIconFrameDimmed"), s2t("interpolationType"), s2t("bicubicAutomatic"));
executeAction(s2t("imageSize"), descriptor, DialogModes.NO);
} catch (e) {
alert("Error in imageSize:\n" + e.message + "\nLine: " + e.line);
}
}
function hasArtboards() {
try {
for (var i = 0; i < activeDocument.layerSets.length; i++) {
activeDocument.activeLayer = activeDocument.layerSets[i];
var r = new ActionReference();
r.putEnumerated(stringIDToTypeID('layer'), stringIDToTypeID('ordinal'), stringIDToTypeID('targetEnum'));
var options = executeActionGet(r);
if (options.hasKey(stringIDToTypeID('artboard'))) return true;
}
return false;
} catch (e) {
alert("Error:\n" + e.message + "\nLine: " + e.line);
}
}
function isArtboard() {
try {
var r = new ActionReference();
r.putEnumerated(stringIDToTypeID('layer'), stringIDToTypeID('ordinal'), stringIDToTypeID('targetEnum'));
var options = executeActionGet(r);
return options.hasKey(stringIDToTypeID('artboard'));
} catch (e) {
alert("Error:\n" + e.message + "\nLine: " + e.line);
}
}
function dupeActiveLayer(docName, layerName) {
try {
var s2t = function (s) { return stringIDToTypeID(s); };
var descriptor = new ActionDescriptor();
var reference = new ActionReference();
var reference2 = new ActionReference();
reference.putClass(s2t("document"));
descriptor.putReference(charIDToTypeID("null"), reference);
descriptor.putString(s2t("name"), docName);
reference2.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
descriptor.putReference(s2t("using"), reference2);
descriptor.putString(s2t("layerName"), layerName);
executeAction(s2t("make"), descriptor, DialogModes.NO);
} catch (e) {
alert("Error:\n" + e.message + "\nLine: " + e.line);
}
}
function trimTransparency(top, bottom, left, right) {
try {
var c2t = function (s) { return charIDToTypeID(s); };
var s2t = function (s) { return stringIDToTypeID(s); };
var descriptor = new ActionDescriptor();
descriptor.putEnumerated(s2t("trimBasedOn"), s2t("trimBasedOn"), c2t("Trns"));
descriptor.putBoolean(s2t("top"), top);
descriptor.putBoolean(s2t("bottom"), bottom);
descriptor.putBoolean(s2t("left"), left);
descriptor.putBoolean(s2t("right"), right);
executeAction(s2t("trim"), descriptor, DialogModes.NO);
} catch (e) {
alert("Error:\n" + e.message + "\nLine: " + e.line);
}
}
function removeCRSmeta() {
try {
if (!documents.length) return;
if (ExternalObject.AdobeXMPScript === undefined) ExternalObject.AdobeXMPScript = new ExternalObject("lib:AdobeXMPScript");
var xmp = new XMPMeta(app.activeDocument.xmpMetadata.rawData);
XMPUtils.removeProperties(xmp, XMPConst.NS_CAMERA_RAW, "", XMPConst.REMOVE_ALL_PROPERTIES);
app.activeDocument.xmpMetadata.rawData = xmp.serialize();
} catch (e) {
alert("Error:\n" + e.message + "\nLine: " + e.line);
}
}
function deleteDocumentAncestorsMetadata() {
try {
if (!documents.length) return;
if (ExternalObject.AdobeXMPScript === undefined) ExternalObject.AdobeXMPScript = new ExternalObject("lib:AdobeXMPScript");
var xmp = new XMPMeta(activeDocument.xmpMetadata.rawData);
xmp.deleteProperty(XMPConst.NS_PHOTOSHOP, "DocumentAncestors");
app.activeDocument.xmpMetadata.rawData = xmp.serialize();
} catch (e) {
alert("Error:\n" + e.message + "\nLine: " + e.line);
}
}
function removeXMP() {
if (!documents.length) return;
if (ExternalObject.AdobeXMPScript === undefined) ExternalObject.AdobeXMPScript = new ExternalObject("lib:AdobeXMPScript");
var xmp = new XMPMeta(activeDocument.xmpMetadata.rawData);
XMPUtils.removeProperties(xmp, "", "", XMPConst.REMOVE_ALL_PROPERTIES);
app.activeDocument.xmpMetadata.rawData = xmp.serialize();
}
function saveAsWebP(saveName) {
try {
var s2t = function (s) { return stringIDToTypeID(s); };
var descriptor = new ActionDescriptor();
var descriptor2 = new ActionDescriptor();
var compressionType = exportSettings.isLossy ? s2t("compressionLossy") : s2t("compressionLossless");
descriptor2.putEnumerated(s2t("compression"), s2t("WebPCompression"), compressionType);
descriptor2.putInteger(s2t("quality"), exportSettings.quality);
descriptor2.putBoolean(s2t("includeXMPData"), false);
descriptor2.putBoolean(s2t("includeEXIFData"), false);
descriptor2.putBoolean(s2t("includePsExtras"), false);
descriptor.putObject(s2t("as"), s2t("WebPFormat"), descriptor2);
descriptor.putPath(s2t("in"), new File(exportSettings.outputFolder + '/' + saveName + '.webp'));
descriptor.putBoolean(s2t("lowerCase"), true);
descriptor.putEnumerated(s2t("saveStage"), s2t("saveStageType"), s2t("saveSucceeded"));
executeAction(s2t("save"), descriptor, DialogModes.NO);
} catch (e) {
alert("Error:\n" + e.message + "\nLine: " + e.line);
}
}
function saveAsJPEG(_name) {
var jpgOptns = new JPEGSaveOptions();
jpgOptns.formatOptions = FormatOptions.STANDARDBASELINE;
jpgOptns.embedColorProfile = true;
jpgOptns.matte = MatteType.NONE;
jpgOptns.quality = exportSettings.jpegQuality || 9;
activeDocument.saveAs(new File(exportSettings.outputFolder + '/' + _name + '.jpg'), jpgOptns, true, Extension.LOWERCASE);
}
function getTimestamp() {
var now = new Date();
return now.getFullYear().toString() +
("0" + (now.getMonth() + 1)).slice(-2) +
("0" + now.getDate()).slice(-2) + "-" +
("0" + now.getHours()).slice(-2) +
("0" + now.getMinutes()).slice(-2) +
("0" + now.getSeconds()).slice(-2);
}
} catch (e) {
alert("Error:\n" + e.message + "\nLine: " + e.line);
}
})();