Answered
Script for exporting transparent PNG files with ICC embedded
Hi,
I'm trying to create a script for Photoshop that will convert layered tiff files to png files with transparency.
I created this script, but despite having transparency = true in the save options, the pngs are saved without transparency. They are also converted to sRGB when I want the original profile to be preserved and embedded.
#target photoshop
app.displayDialogs = DialogModes.NO;
function convertTIFtoPNG() {
var inputFolder = Folder.selectDialog("Select the folder containing TIFF images");
if (!inputFolder) return; // Exit if no folder is selected
var outputFolder = new Folder(inputFolder + "/PNG");
if (!outputFolder.exists) outputFolder.create();
var tifFiles = inputFolder.getFiles("*.tif");
if (tifFiles.length === 0) {
alert("No TIFF files found in the selected folder.");
return;
}
for (var i = 0; i < tifFiles.length; i++) {
var file = tifFiles[i];
if (file instanceof File) {
try {
open(file);
var doc = app.activeDocument;
app.refresh();
if (!doc) {
alert("Error: Document did not open properly.");
continue;
}
// Select all layers
selectAllLayers();
// Merge selected layers (preserving transparency)
doc.activeLayer = doc.artLayers[0]; // Ensure a layer is active
doc.mergeVisibleLayers();
// Export As PNG using "Export As"
var pngFilePath = outputFolder.fsName + "/" + file.name.replace(/\.[^\.]+$/, ".png");
exportAsPNG(pngFilePath);
doc.close(SaveOptions.DONOTSAVECHANGES);
} catch (e) {
alert("Error processing file: " + file.name + "\n" + e);
}
}
}
alert("Conversion completed! PNG files are in the 'PNG' subfolder.");
}
// Function to manually select all layers
function selectAllLayers() {
var doc = app.activeDocument;
var layers = doc.artLayers;
var sets = doc.layerSets;
if (layers.length + sets.length < 2) return; // No need to select if only one layer
// Deselect all layers first
doc.activeLayer = layers[layers.length - 1];
// Select each layer manually
for (var i = 0; i < layers.length; i++) {
layers[i].visible = true; // Make sure all layers are visible
layers[i].selected = true;
}
for (var j = 0; j < sets.length; j++) {
selectGroupLayers(sets[j]); // Select layers inside groups
}
}
// Function to select layers inside groups (Layer Sets)
function selectGroupLayers(layerSet) {
for (var i = 0; i < layerSet.artLayers.length; i++) {
layerSet.artLayers[i].visible = true;
layerSet.artLayers[i].selected = true;
}
for (var j = 0; j < layerSet.layerSets.length; j++) {
selectGroupLayers(layerSet.layerSets[j]); // Recursively select layers in nested groups
}
}
// Function to export PNG using "Export As"
function exportAsPNG(filePath) {
var exportOptions = new ExportOptionsSaveForWeb();
exportOptions.format = SaveDocumentType.PNG;
exportOptions.PNG8 = false; // Use PNG-24 for better quality
exportOptions.transparency = true; // Preserve transparency
exportOptions.interlaced = false;
exportOptions.quality = 100; // Maximum quality
exportOptions.includeProfile = true; // Embed color profile
app.activeDocument.exportDocument(new File(filePath), ExportType.SAVEFORWEB, exportOptions);
}
convertTIFtoPNG();
