我是一名Web开发人员,并且可以胜任Fireworks的工作,但在Photoshop中却没有那么多。
我刚收到一个分层的PSD文件,它将变成一个网页。谁能告诉我将所有图层导出到单个png文件的最简单方法吗?
有很多层,手动执行此操作似乎是错误的。
我已经看到了这一点,但看来PS中应该对此具有本机功能。
我可以使用Photoshop CS4。任何指针表示赞赏。
convert
Imagemagick 的free 命令可用于此目的(它可能缺少完整的psd功能介绍)。
我是一名Web开发人员,并且可以胜任Fireworks的工作,但在Photoshop中却没有那么多。
我刚收到一个分层的PSD文件,它将变成一个网页。谁能告诉我将所有图层导出到单个png文件的最简单方法吗?
有很多层,手动执行此操作似乎是错误的。
我已经看到了这一点,但看来PS中应该对此具有本机功能。
我可以使用Photoshop CS4。任何指针表示赞赏。
convert
Imagemagick 的free 命令可用于此目的(它可能缺少完整的psd功能介绍)。
Answers:
File >> Scripts >> Export layers to files...
这是一些相关的问题...
我花了一些时间并编写了自己的脚本文件来自动化该过程。 此过程比上面提到的内置脚本快得多。
附加信息
我在60秒内在100层450MB文件上运行了该脚本。在同一文件上运行内置脚本大约需要30分钟。
在使用嵌套图层组进行测试时,我发现我的脚本运行大约90秒,而内置脚本大约需要27分钟(实际上将其导出错误)。
请注意,这些结果将根据文件的复杂性,计算机上的硬件以及Photoshop的版本而有所不同。其他性能数据。
在过去的几年中,该脚本得到了不同贡献者的各种改进。如果脚本遇到任何问题。您可以在此处提交脚本问题。
请通读自述文件以获取其他任何附加信息。
免责声明:此脚本不以任何方式与Adobe相关联。使用脚本需要您自担风险-使用前请务必备份PSD。对于任何损坏或丢失的数据,我概不负责。
File -> Export -> Layers to Files...
我已经在一年前更新了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();