Photoshop CS4〜CC編 レイヤーごとにファイルに書き出す

Photoshopには標準でレイヤーごとにファイルに書き出す機能があります。CS4以降ではファイル>スクリプト>レイヤーをファイルへ書き出し..を選択することでレイヤーごと保存されます。また、書き出す際にはPNGやPSDなどのフォーマットも選択することができます。
それなら、今回のスクリプトはいらないのでは?と思う人がいるかもしれません。ところが標準のレイヤーごとの書き出しはサブフォルダがあると、そのフォルダも書き出されてしまいます。単純にレイヤーだけを書き出したいのにサブフォルダなどよけいなものも書き出されてしまうと困ります。また、Web上にはレイヤーごとに書き出すスクリプトもありますが、フラットな場合のみの書き出しだったりするため、複雑なレイヤー/レイヤーセットで構成されている場合、期待する結果になりません。
ということで、レイヤーだけを書き出すスクリプトが以下になります。スクリプトは2段階の処理を行っています。というのも、レイヤーをチェックして、そのレイヤーだけを書き出すとうまくいかないためです。仕方ないのでレイヤーをフラットな状態にした後で、順番に書き出すという手間のかかることをしています。PhotoshopもIllustratorのように他のドキュメントにレイヤーをコピーする機能があればよいのですが。(copy(), paste()だとうまくいかない)


// Photoshopのレイヤーをレイヤー毎にファイルに書き出す
#target "Photoshop"
// 階層状態のレイヤーをフラットな状態にする
function flatLayer(docObj){
for(var i=0; i<docObj.artLayers.length; i++){
// レイヤーを先頭に移動させる。背景の場合は移動できないので無視する
try{
docObj.artLayers[i].move(activeDocument.layers[0], ElementPlacement.PLACEBEFORE);
}catch(e){}
}
// レイヤーセットは再帰を使って処理
for(var i=0; i<docObj.layerSets.length; i++){
flatLayer(docObj.layerSets[i]);
}
}
// artLayerの数を調べる。最初の階層以外に存在するならばtrueを返す
function checkLayer(docObj, level){
if((level > 0) && (docObj.artLayers.length > 0)){ return true; }
// レイヤーセットは再帰を使って処理
for(var i=0; i<docObj.layerSets.length; i++){
level = level + 1;
return checkLayer(docObj.layerSets[i], level);
}
return false;
}
// 一番上のレイヤー以外のレイヤーを全て削除する
function deleteLayer(){
for(var i=activeDocument.layers.length-1; i>0; i--){
try{
activeDocument.layers[i].remove();
}catch(e){}
}
}
// メイン処理
(function(){
// 保存先のフォルダを選択する
var baseFolder = Folder.selectDialog("保存先のフォルダを指定してください");
if (!baseFolder){ return; }
// ドキュメントを複製する
var baseDoc = app.activeDocument.duplicate(app.activeDocument);
// レイヤーをフラットな状態にする
while(checkLayer(baseDoc, 0)){
flatLayer(baseDoc);
}
// レイヤーセットを全て削除する(不要になったため)
for(var i=baseDoc.layerSets.length-1; i>=0; i--){
baseDoc.layerSets[i].remove();
}
// レイヤーを書き出す
for(var i=0; i<baseDoc.artLayers.length; i++){
var saveName = baseFolder.fsName+"/"+baseDoc.artLayers[i].name+".psd";
var dupDoc = app.activeDocument.duplicate(app.activeDocument);
// 保存すべきレイヤー以外を削除する
for(var j=0; j<dupDoc.artLayers.length; j++){
if (i == j){
// 保存用に複製する
try { // 背景の場合は移動できないのでエラーになる。このエラーは無視する
// レイヤーを先頭に移動させる。背景の場合は移動できないので無視する
dupDoc.artLayers[i].move(activeDocument.layers[0], ElementPlacement.PLACEBEFORE);
}catch(e){}
// 先頭のレイヤー以外を削除する
deleteLayer();
break;
}
}
// PSD形式で保存し不要になったドキュメントを閉じる
var fileObj = new File(saveName);
activeDocument.saveAs(fileObj);
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}
// 複製したドキュメントを保存せず閉じる
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
})();


[サンプルをダウンロード]