@crehage2
Try this batch script. I would advise you to have a small number of files in the source folder as this may take a while to run, particularly if the source files are high-resolution, 16-BPC docs. You should also keep drive space in mind as you process the files. Output files will overwrite any existing files without warning.
/*
All Top-Level Layers With Content Aware Fill to TIFF.jsx
v1.0 - 22nd August 2024, Stephen Marsh
v1.1 - 23rd August 2024, Added a conditional check to only process smart object layers
https://community.adobe.com/t5/photoshop-ecosystem-discussions/quot-expand-quot-and-quot-content-aware-fill-quot-functions-are-not-working-via-javascript/td-p/14810803
*/
#target photoshop
(function () {
// Ensure that no docs are open
if (app.documents.length == 0) {
try {
// Set the input folder
var inputFolder = Folder.selectDialog("Please select the folder to process...");
if (inputFolder === null) {
//alert('Script cancelled!');
return;
}
// Limit the file input to psd/psb
var inputFolderList = inputFolder.getFiles(/\.(psd|psb)$/i);
// Validate that input folder contains psd/psb files
var validateEmptyList = (inputFolderList.length > 0);
if (validateEmptyList === false) {
alert("Script cancelled as the input folder is empty!");
return;
}
// Alpha-numeric sort
inputFolderList.sort();
// Set the output folder
var outputFolder = Folder.selectDialog("Please select the folder to save to...");
if (outputFolder === null) {
//alert('Script cancelled!');
return;
}
// TIFF save options
var tiffSaveOptions = new TiffSaveOptions();
tiffSaveOptions.imageCompression = TIFFEncoding.NONE;
tiffSaveOptions.embedColorProfile = true;
tiffSaveOptions.byteOrder = ByteOrder.IBM;
tiffSaveOptions.transparency = true;
tiffSaveOptions.layers = false;
tiffSaveOptions.layerCompression = LayerCompression.ZIP;
tiffSaveOptions.interleaveChannels = true;
tiffSaveOptions.alphaChannels = true;
tiffSaveOptions.annotations = true;
tiffSaveOptions.spotColors = true;
tiffSaveOptions.saveImagePyramid = false;
// Set the file processing counter
var outputCounter = 0;
// Hide the Photoshop panels
app.togglePalettes();
// Script running notification window - courtesy of William Campbell
/* https://www.marspremedia.com/download?asset=adobe-script-tutorial-11.zip
https://youtu.be/JXPeLi6uPv4?si=Qx0OVNLAOzDrYPB4 */
var working;
working = new Window("palette");
working.preferredSize = [300, 80];
working.add("statictext");
working.t = working.add("statictext");
working.add("statictext");
working.display = function (message) {
this.t.text = message || "Script running, please wait...";
this.show();
app.refresh();
};
working.display();
// Start Timer
var timeDiff = {
setStartTime: function () {
d = new Date();
time = d.getTime();
},
getDiff: function () {
d = new Date();
t = d.getTime() - time;
time = d.getTime();
return t;
}
};
timeDiff.setStartTime();
// Loop over the psd/psb files
for (var i = 0; i < inputFolderList.length; i++) {
open(inputFolderList[i]);
var docName = app.activeDocument.name.replace(/\.[^\.]+$/, '');
var layerName = app.activeDocument.activeLayer.name;
// Set the zero padding and layer processing counter
var zeroPadLength = 3;
var layerCounter = 1;
// Loop over the top-level layers
for (var j = 0; j < app.activeDocument.layers.length; j++) {
app.activeDocument.activeLayer = app.activeDocument.layers[j];
// Only process smart object layers
if (app.activeDocument.activeLayer.kind == LayerKind.SMARTOBJECT) {
// Active layer processing
dupeLayerToDoc(layerName, layerName);
rasterizeLayer();
layerTransparencyToSelection();
executeAction(stringIDToTypeID("inverse"), undefined, DialogModes.NO);
app.activeDocument.selection.expand(UnitValue(1, 'px'));
contentAwareFill(false, false, false);
app.activeDocument.selection.deselect();
app.activeDocument.flatten();
// Save as TIFF
app.activeDocument.saveAs(new File(outputFolder + '/' + docName + ' ' + zeroPad(layerCounter, zeroPadLength) + '.tif'), tiffSaveOptions);
// Close the TIFF doc
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
// Increment the layer processing counter
layerCounter++
// Increment the file processing counter
outputCounter++
}
}
// Close the PSD/PSB doc
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}
// Ensure Photoshop has focus before closing the running script notification window
app.bringToFront();
working.close();
// End of script notification
app.beep();
alert('Script completed!' + '\r' + inputFolderList.length + ' source PSD/PSB files processed & ' + '\r' + outputCounter + ' TIFF files created.' + "\r" + "Run Time: " + timeDiff.getDiff() / 1000 + " seconds.");
// Restore the Photoshop panels
app.togglePalettes();
// Open the output folder in Windows Explorer or the Mac Finder
//outputFolder.execute();
///// Functions /////
function dupeLayerToDoc(theNewDocName, theLayerName) {
var s2t = function (s) {
return app.stringIDToTypeID(s);
};
var descriptor = new ActionDescriptor();
var reference = new ActionReference();
var reference2 = new ActionReference();
reference2.putClass(s2t("document"));
descriptor.putReference(s2t("null"), reference2);
descriptor.putString(s2t("name"), theNewDocName);
reference.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
descriptor.putReference(s2t("using"), reference);
descriptor.putString(s2t("layerName"), theLayerName);
executeAction(s2t("make"), descriptor, DialogModes.NO);
}
function rasterizeLayer() {
var s2t = function (s) {
return app.stringIDToTypeID(s);
};
var descriptor = new ActionDescriptor();
var reference = new ActionReference();
reference.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
descriptor.putReference(s2t("null"), reference);
executeAction(s2t("rasterizeLayer"), descriptor, DialogModes.NO);
}
function layerTransparencyToSelection() {
var s2t = function (s) {
return app.stringIDToTypeID(s);
};
var descriptor = new ActionDescriptor();
var reference = new ActionReference();
var reference2 = new ActionReference();
reference.putProperty(s2t("channel"), s2t("selection"));
descriptor.putReference(s2t("null"), reference);
reference2.putEnumerated(s2t("channel"), s2t("channel"), s2t("transparencyEnum"));
descriptor.putReference(s2t("to"), reference2);
executeAction(s2t("set"), descriptor, DialogModes.NO);
}
function contentAwareFill(cafSampleAllLayers, cafScale, cafMirror) {
var s2t = function (s) {
return app.stringIDToTypeID(s);
};
var descriptor = new ActionDescriptor();
descriptor.putEnumerated(s2t("cafSamplingRegion"), s2t("cafSamplingRegion"), s2t("cafSamplingRegionRectangular"));
descriptor.putBoolean(s2t("cafSampleAllLayers"), cafSampleAllLayers);
descriptor.putEnumerated(s2t("cafColorAdaptationLevel"), s2t("cafColorAdaptationLevel"), s2t("cafColorAdaptationDefault"));
descriptor.putEnumerated(s2t("cafRotationAmount"), s2t("cafRotationAmount"), s2t("cafRotationAmountNone"));
descriptor.putBoolean(s2t("cafScale"), cafScale);
descriptor.putBoolean(s2t("cafMirror"), cafMirror);
descriptor.putEnumerated(s2t("cafOutput"), s2t("cafOutput"), s2t("cafOutputToCurrentLayer"));
executeAction(s2t("cafWorkspace"), descriptor, DialogModes.NO);
}
function zeroPad(num, digit) {
var tmp = num.toString();
while (tmp.length < digit) {
tmp = "0" + tmp;
}
return tmp;
}
} catch (err) {
while (app.documents.length > 0) {
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}
alert("Error!" + "\r" + err + "\r" +'Line: ' + err.line);
}
} else {
alert('Please close all open documents before running this script!');
}
}());