我是一名网络开发人员,精通 Fireworks,但在 Photoshop 方面却不那么出色。
我刚刚收到一个分层的 PSD 文件,可以变成一个网页。谁能告诉我将所有图层导出到单个 png 文件的最简单方法?
有很多层,手动执行此操作似乎是错误的。
我已经看到了这一点,但似乎在 PS 中应该有本机功能。
我可以访问 Photoshop CS4。任何指针表示赞赏。
我是一名网络开发人员,精通 Fireworks,但在 Photoshop 方面却不那么出色。
我刚刚收到一个分层的 PSD 文件,可以变成一个网页。谁能告诉我将所有图层导出到单个 png 文件的最简单方法?
有很多层,手动执行此操作似乎是错误的。
我已经看到了这一点,但似乎在 PS 中应该有本机功能。
我可以访问 Photoshop CS4。任何指针表示赞赏。
File >> Scripts >> Export layers to files...
这里有一些相关的问题......
将图层导出到文件仅从 100 个图层导出 4 个 png 文件
我花了一些时间编写了自己的脚本文件来自动化这个过程。 这个过程比上面提到的内置脚本要快得多。
附加信息
我在 60 秒内在一个 100 层、450MB 的文件上运行了这个脚本。在同一个文件上运行内置脚本大约需要 30 分钟。
在使用嵌套层组进行测试时,我发现我的脚本运行大约 90 秒,而内置脚本大约需要 27 分钟(实际上导出错误)。
请注意,这些结果会因文件的复杂性以及计算机上的硬件和 Photoshop 的版本而异。附加性能数据。
这个脚本(在过去的几年里)从不同的贡献者那里得到了各种改进。如果您在脚本中遇到任何问题。您可以在此处提交有关脚本的问题。
请通读自述文件以获取任何其他附加信息。
免责声明:此脚本与 Adobe 没有任何关联。请自行承担使用脚本的风险——使用前请务必备份您的 PSD。我不对任何损坏或丢失的数据负责。
我已经更新了一年前 Johannes 的解决方案,并进行了许多改进。显着地:
除此之外,代码已被清理。例如,全局变量已集成到单个数组中。
请注意,最初的弹出消息只会告诉您顶层的数量。这是为了避免性能下降。我真的无法想象您对正在处理的文件一无所知的情况,因此这不应该是太大的妥协。
在此处获取脚本。感谢前任作者带路。
我更新了脚本以使用文档的核心 BackgroundLayer。这样每个导出的 jpg 都会用它编译。
如果有人向图层添加标记以使其成为主图层而不是默认的 BackgroundLayer,那就太好了;-)
完整脚本:
// NAME:
// SaveLayers
// DESCRIPTION:
// Saves each layer in the active document to a PNG or JPG file named after the layer.
// These files will be created in the current document folder (same as working PSD).
// REQUIRES:
// Adobe Photoshop CS2 or higher
//Most current version always available at: https://github.com/jwa107/Photoshop-Export-Layers-as-Images
// enable double-clicking from Finder/Explorer (CS2 and higher)
#target photoshop
app.bringToFront();
function main() {
// two quick checks
if(!okDocument()) {
alert("Document must be saved and be a layered PSD.");
return;
}
var len = activeDocument.layers.length;
var ok = confirm("Note: All layers will be saved in same directory as your PSD.\nThis document contains " + len + " top level layers.\nBe aware that large numbers of layers may take some time!\nContinue?");
if(!ok) return
// user preferences
prefs = new Object();
prefs.fileType = "";
prefs.fileQuality = 12;
prefs.filePath = app.activeDocument.path;
prefs.count = 0;
//instantiate dialogue
Dialog();
hideLayers(activeDocument);
saveLayers(activeDocument);
toggleVisibility(activeDocument);
alert("Saved " + prefs.count + " files.");
}
function hideLayers(ref) {
var len = ref.layers.length;
for (var i = 0; i < len; i++) {
var layer = ref.layers[i];
if (layer.typename == 'LayerSet') hideLayers(layer);
else layer.visible = false;
}
}
function toggleVisibility(ref) {
var len = ref.layers.length;
for (var i = 0; i < len; i++) {
layer = ref.layers[i];
layer.visible = !layer.visible;
}
}
function saveLayers(ref) {
var len = ref.layers.length;
// rename layers top to bottom
for (var i = 0; i < len; i++) {
var layer = ref.layers[i];
if (layer.typename == 'LayerSet') {
// recurse if current layer is a group
hideLayers(layer);
saveLayers(layer);
} else {
// otherwise make sure the layer is visible and save it
layer.visible = true;
// NEW MASTER BACKGROUND LAYER -- comment this line if u dont want to see that layer compiled in the jpgs
activeDocument.backgroundLayer.visible = true;
saveImage(layer.name);
layer.visible = false;
}
}
}
function saveImage(layerName) {
var fileName = layerName.replace(/[\\\*\/\?:"\|<> ]/g,'');
if(fileName.length ==0) fileName = "autoname";
var handle = getUniqueName(prefs.filePath + "/" + fileName);
prefs.count++;
if(prefs.fileType=="PNG" && prefs.fileQuality=="8") {
SavePNG8(handle);
} else if (prefs.fileType=="PNG" && prefs.fileQuality=="24") {
SavePNG24(handle);
} else {
SaveJPEG(handle);
}
}
function getUniqueName(fileroot) {
// form a full file name
// if the file name exists, a numeric suffix will be added to disambiguate
var filename = fileroot;
for (var i=1; i<100; i++) {
var handle = File(filename + "." + prefs.fileType);
if(handle.exists) {
filename = fileroot + "-" + padder(i, 3);
} else {
return handle;
}
}
}
function padder(input, padLength) {
// pad the input with zeroes up to indicated length
var result = (new Array(padLength + 1 - input.toString().length)).join('0') + input;
return result;
}
function SavePNG8(saveFile) {
exportOptionsSaveForWeb = new ExportOptionsSaveForWeb();
exportOptionsSaveForWeb.format = SaveDocumentType.PNG
exportOptionsSaveForWeb.dither = Dither.NONE;
activeDocument.exportDocument( saveFile, ExportType.SAVEFORWEB, exportOptionsSaveForWeb );
}
function SavePNG24(saveFile) {
pngSaveOptions = new PNGSaveOptions();
activeDocument.saveAs(saveFile, pngSaveOptions, true, Extension.LOWERCASE);
}
function SaveJPEG(saveFile) {
jpegSaveOptions = new JPEGSaveOptions();
jpegSaveOptions.quality = prefs.fileQuality;
activeDocument.saveAs(saveFile, jpegSaveOptions, true, Extension.LOWERCASE);
}
function Dialog() {
// build dialogue
var dlg = new Window ('dialog', 'Select Type');
dlg.saver = dlg.add("dropdownlist", undefined, "");
dlg.quality = dlg.add("dropdownlist", undefined, "");
dlg.pngtype = dlg.add("dropdownlist", undefined, "");
// file type
var saveOpt = [];
saveOpt[0] = "PNG";
saveOpt[1] = "JPG";
for (var i=0, len=saveOpt.length; i<len; i++) {
dlg.saver.add ("item", "Save as " + saveOpt[i]);
};
// trigger function
dlg.saver.onChange = function() {
prefs.fileType = saveOpt[parseInt(this.selection)];
// decide whether to show JPG or PNG options
if(prefs.fileType==saveOpt[1]){
dlg.quality.show();
dlg.pngtype.hide();
} else {
dlg.quality.hide();
dlg.pngtype.show();
}
};
// jpg quality
var qualityOpt = [];
for(var i=12; i>=1; i--) {
qualityOpt[i] = i;
dlg.quality.add ('item', "" + i);
};
// png type
var pngtypeOpt = [];
pngtypeOpt[0]=8;
pngtypeOpt[1]=24;
dlg.pngtype.add ('item', ""+ 8 );
dlg.pngtype.add ('item', "" + 24);
// trigger functions
dlg.quality.onChange = function() {
prefs.fileQuality = qualityOpt[12-parseInt(this.selection)];
};
dlg.pngtype.onChange = function() {
prefs.fileQuality = pngtypeOpt[parseInt(this.selection)];
};
// remainder of UI
var uiButtonRun = "Continue";
dlg.btnRun = dlg.add("button", undefined, uiButtonRun );
dlg.btnRun.onClick = function() {
this.parent.close(0);
};
dlg.orientation = 'column';
dlg.saver.selection = dlg.saver.items[0] ;
dlg.quality.selection = dlg.quality.items[0] ;
dlg.center();
dlg.show();
}
function okDocument() {
// check that we have a valid document
if (!documents.length) return false;
var thisDoc = app.activeDocument;
var fileExt = decodeURI(thisDoc.name).replace(/^.*\./,'');
return fileExt.toLowerCase() == 'psd'
}
function wrapper() {
function showError(err) {
alert(err + ': on line ' + err.line, 'Script Error', true);
}
try {
// suspend history for CS3 or higher
if (parseInt(version, 10) >= 10) {
activeDocument.suspendHistory('Save Layers', 'main()');
} else {
main();
}
} catch(e) {
// report errors unless the user cancelled
if (e.number != 8007) showError(e);
}
}
wrapper();