|
It looks like Artboards (multiple in one document) functionalities are made for digital output only.
People who want to use it for printouts will have a hard time as they more often than not need res higher than 72 ppi (dpi).
|
This is only an issue if using the export command which is designed to remove such metadata... And the script provided with Photoshop to export all artboards uses the export option.
Keep in mind that a file 3000x5000px @ 72ppi is just as "high resolution" as a file 3000x5000px @ 300ppi – they both have the same total number of pixels.
To work around the issue, you need to use a script that is using save as PNG rather than export as PNG. Note that save as does not retain any ICC colour profiles... And if you attempt to open the PNG and use export to retain an assigned ICC profile, you will lose the resolution metadata and be back where you started!
| Save/Export Method |
Resolution Metadata Retained |
ICC Profile Retained |
| Save As PNG |
Yes |
No |
| Export As PNG |
No |
Yes |
| Export Save for Web PNG |
No |
Yes |
As of CC2018, no single method retains both the resolution and ICC profile metadata for a PNG.
(P.S.: The PNG specification uses pixels per metre not PPI or DPI – with 11811 ppm the equivalent of 300 ppi)
This script only uses the artboard name for the save as PNG:
// 2019 - Hacked to save as PNG retaining PNG-pHYs:PixelsPerUnit metadata
// Saves using artboard names only
// https://forums.adobe.com/message/11082022
// Originall script author below:
// ============================================================================
// artboardsToPNG.jsx - Adobe Photoshop Script
// Version: 0.6.0
// Requirements: Adobe Photoshop CC 2015, or higher
// Author: Anton Lyubushkin (nvkz.nemo@gmail.com)
// Website: http://lyubushkin.pro/
// ============================================================================
// Installation:
// 1. Place script in:
// PC: C:\Program Files\Adobe\Adobe Photoshop CC#\Presets\Scripts\
// Mac: <hard drive>/Applications/Adobe Photoshop CC#/Presets/Scripts/
// 2. Restart Photoshop
// 3. Choose File > Scripts > artboardsToPNG
// ============================================================================
#target photoshop
app.bringToFront();
var docRef = app.activeDocument,
allArtboards,
artboardsCount = 0,
inputFolder = Folder.selectDialog("Select an output folder for the save as PNG");
if (inputFolder) {
function getAllArtboards() {
try {
var ab = [];
var theRef = new ActionReference();
theRef.putProperty(charIDToTypeID('Prpr'), stringIDToTypeID("artboards"));
theRef.putEnumerated(charIDToTypeID('Dcmn'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
var getDescriptor = new ActionDescriptor();
getDescriptor.putReference(stringIDToTypeID("null"), theRef);
var abDesc = executeAction(charIDToTypeID("getd"), getDescriptor, DialogModes.NO).getObjectValue(stringIDToTypeID("artboards"));
var abCount = abDesc.getList(stringIDToTypeID('list')).count;
if (abCount > 0) {
for (var i = 0; i < abCount; ++i) {
var abObj = abDesc.getList(stringIDToTypeID('list')).getObjectValue(i);
var abTopIndex = abObj.getInteger(stringIDToTypeID("top"));
ab.push(abTopIndex);
}
}
return [abCount, ab];
} catch (e) {
alert(e.line + '\n' + e.message);
}
}
function selectLayerByIndex(index, add) {
add = undefined ? add = false : add
var ref = new ActionReference();
ref.putIndex(charIDToTypeID("Lyr "), index + 1);
var desc = new ActionDescriptor();
desc.putReference(charIDToTypeID("null"), ref);
if (add) desc.putEnumerated(stringIDToTypeID("selectionModifier"), stringIDToTypeID("selectionModifierType"), stringIDToTypeID("addToSelection"));
desc.putBoolean(charIDToTypeID("MkVs"), false);
executeAction(charIDToTypeID("slct"), desc, DialogModes.NO);
}
function ungroupLayers() {
var desc1 = new ActionDescriptor();
var ref1 = new ActionReference();
ref1.putEnumerated(charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
desc1.putReference(charIDToTypeID('null'), ref1);
executeAction(stringIDToTypeID('ungroupLayersEvent'), desc1, DialogModes.NO);
}
function crop() {
var desc1 = new ActionDescriptor();
desc1.putBoolean(charIDToTypeID('Dlt '), true);
executeAction(charIDToTypeID('Crop'), desc1, DialogModes.NO);
}
function saveAsPNG(_name) {
png_Opt = new PNGSaveOptions();
png_Opt.compression = 0;
png_Opt.interlaced = false;
app.activeDocument.saveAs(File(inputFolder + '/' + _name + '.png'), png_Opt, true);
}
function main(i) {
selectLayerByIndex(allArtboards[1][i]);
var artboardName = app.activeDocument.activeLayer.name;
executeAction(stringIDToTypeID("newPlacedLayer"), undefined, DialogModes.NO);
executeAction(stringIDToTypeID("placedLayerEditContents"), undefined, DialogModes.NO);
app.activeDocument.selection.selectAll();
ungroupLayers();
crop();
saveAsPNG(artboardName);
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}
allArtboards = getAllArtboards();
artboardsCount = allArtboards[0];
for (var i = 0; i < artboardsCount; i++) {
docRef.suspendHistory('Save Artboard as PNG', 'main(' + i + ')');
app.refresh();
app.activeDocument.activeHistoryState = app.activeDocument.historyStates[app.activeDocument.historyStates.length - 2];
}
}
// Added another close step as the original script was not closing in CC2018
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
This script uses the filename plus _artboard name for the save as PNG:
// 2019 - Hacked to save as PNG retaining PNG-pHYs:PixelsPerUnit metadata
// Saves using filename and artboard names
// https://forums.adobe.com/message/11082022
// Originall script author below:
// ============================================================================
// artboardsToPNG.jsx - Adobe Photoshop Script
// Version: 0.6.0
// Requirements: Adobe Photoshop CC 2015, or higher
// Author: Anton Lyubushkin (nvkz.nemo@gmail.com)
// Website: http://lyubushkin.pro/
// ============================================================================
// Installation:
// 1. Place script in:
// PC: C:\Program Files\Adobe\Adobe Photoshop CC#\Presets\Scripts\
// Mac: <hard drive>/Applications/Adobe Photoshop CC#/Presets/Scripts/
// 2. Restart Photoshop
// 3. Choose File > Scripts > artboardsToPNG
// ============================================================================
#target photoshop
app.bringToFront();
var fName = app.activeDocument.name.replace(/\.[^\.]+$/, '') // Added a new filename variable with regex to remove filename extension
var docRef = app.activeDocument,
allArtboards,
artboardsCount = 0,
inputFolder = Folder.selectDialog("Select an output folder for the save as PNG");
if (inputFolder) {
function getAllArtboards() {
try {
var ab = [];
var theRef = new ActionReference();
theRef.putProperty(charIDToTypeID('Prpr'), stringIDToTypeID("artboards"));
theRef.putEnumerated(charIDToTypeID('Dcmn'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
var getDescriptor = new ActionDescriptor();
getDescriptor.putReference(stringIDToTypeID("null"), theRef);
var abDesc = executeAction(charIDToTypeID("getd"), getDescriptor, DialogModes.NO).getObjectValue(stringIDToTypeID("artboards"));
var abCount = abDesc.getList(stringIDToTypeID('list')).count;
if (abCount > 0) {
for (var i = 0; i < abCount; ++i) {
var abObj = abDesc.getList(stringIDToTypeID('list')).getObjectValue(i);
var abTopIndex = abObj.getInteger(stringIDToTypeID("top"));
ab.push(abTopIndex);
}
}
return [abCount, ab];
} catch (e) {
alert(e.line + '\n' + e.message);
}
}
function selectLayerByIndex(index, add) {
add = undefined ? add = false : add
var ref = new ActionReference();
ref.putIndex(charIDToTypeID("Lyr "), index + 1);
var desc = new ActionDescriptor();
desc.putReference(charIDToTypeID("null"), ref);
if (add) desc.putEnumerated(stringIDToTypeID("selectionModifier"), stringIDToTypeID("selectionModifierType"), stringIDToTypeID("addToSelection"));
desc.putBoolean(charIDToTypeID("MkVs"), false);
executeAction(charIDToTypeID("slct"), desc, DialogModes.NO);
}
function ungroupLayers() {
var desc1 = new ActionDescriptor();
var ref1 = new ActionReference();
ref1.putEnumerated(charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
desc1.putReference(charIDToTypeID('null'), ref1);
executeAction(stringIDToTypeID('ungroupLayersEvent'), desc1, DialogModes.NO);
}
function crop() {
var desc1 = new ActionDescriptor();
desc1.putBoolean(charIDToTypeID('Dlt '), true);
executeAction(charIDToTypeID('Crop'), desc1, DialogModes.NO);
}
function saveAsPNG(_name) {
png_Opt = new PNGSaveOptions();
png_Opt.compression = 0;
png_Opt.interlaced = false;
app.activeDocument.saveAs(File(inputFolder + '/' + fName + '_' + _name + '.png'), png_Opt, true);
}
function main(i) {
selectLayerByIndex(allArtboards[1][i]);
var artboardName = app.activeDocument.activeLayer.name;
executeAction(stringIDToTypeID("newPlacedLayer"), undefined, DialogModes.NO);
executeAction(stringIDToTypeID("placedLayerEditContents"), undefined, DialogModes.NO);
app.activeDocument.selection.selectAll();
ungroupLayers();
crop();
saveAsPNG(artboardName);
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}
allArtboards = getAllArtboards();
artboardsCount = allArtboards[0];
for (var i = 0; i < artboardsCount; i++) {
docRef.suspendHistory('Save Artboard as PNG', 'main(' + i + ')');
app.refresh();
app.activeDocument.activeHistoryState = app.activeDocument.historyStates[app.activeDocument.historyStates.length - 2];
}
}
// Added another close step as the original script was not closing in CC2018
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
Update 2021: Script code reformatted for new forum software.