クリエイター手抜きプロジェクト[382]Adobe Photoshop CS4〜CC編 レイヤーごとにファイルに書き出す/古籏一浩

投稿:  著者:  読了時間:8分(本文:約3,600文字)


Photoshopには標準でレイヤーごとにファイルに書き出す機能があります。CS4以降ではファイル>スクリプト>レイヤーをファイルへ書き出し..を選択することでレイヤーごと保存されます。また、書き出す際にはPNGやPSDなどのフォーマットも選択することができます。

それなら、今回のスクリプトはいらないのでは? と思う人がいるかもしれません。ところが、標準のレイヤーごとの書き出しは、サブフォルダがあるとそのフォルダも書き出されてしまいます。単純にレイヤーだけを書き出したいのに、サブフォルダなどよけいなものも書き出されてしまうと困ります。

また、Web上にはレイヤーごとに書き出すスクリプトもありますが、フラットな場合のみの書き出しだったりするため、複雑なレイヤー/レイヤーセットで構成されている場合、期待する結果になりません。


ということで、レイヤーだけを書き出すスクリプトが以下になります。スクリプトは二段階の処理を行っています。というのも、レイヤーをチェックして、そのレイヤーだけを書き出すとうまくいかないためです。仕方ないので、レイヤーをフラットな状態にした後で、順番に書き出すという手間のかかることをしています。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);
})();


【古籏一浩】openspc@alpha.ocn.ne.jp
< http://www.openspc2.org/ >

ハードディスクの容量がもう不足気味。いつも使っているMacProは内蔵HDDだけで16TB(4TB HDD×4)あるけど、もう空きは1TBもない。

1TBあれば、何年分も入ってしまうというのは楽でいいなあ。4K映像とかになると、1TBというのは2〜3回分の撮影で終わっちゃうほど少ない容量だったりします。

せっかくなので、5K映像もやってみようかと思っているけど、一体どのくらいの容量になるのか。4K RAW映像だと90秒で4GB。1TBだと23040秒=384分≒6時間半。5K RAW映像だと多分4時間くらいな気がする……。

1980年代中頃は、640Kのフロッピーディスクとか大容量だったのに、ものすごい増え方をしてきたなあ。HDD容量が不足している人は結構多いみたいで、40TB HDD(RAID)も出てました。東芝は5TB HDDなので日立の6TB HDD積んだのを待つのがよさそう。

・8ベイRAID 40TB
< http://www.akibakan.com/search.html?operation=search&keyword=8ベイRAID+40TB >

・JavaScript逆引きハンドブック【増刷中】
< http://www.amazon.co.jp/dp/4863541082 >

・D3.js例文辞典
< http://www.openspc2.org/reibun/D3.js/ >

・Dart例文辞典
< http://www.openspc2.org/reibun/Dart/ver1.1/ >

・Adobe CS2〜CS6,CC JavaScriptリファレンス&ライブラリ
< http://www.openspc2.org/reibun/AdobeJS/index.html >

・Adobe JavaScriptリファレンス(検索できないのはKindleのバグらしい)
< http://www.amazon.co.jp/dp/4844395955 >

・ハイビジョン映像素材集
< http://www.openspc2.org/HDTV/ >

・Nexus 7(アンドロイドタブレット)使い方辞典
< http://www.openspc2.org/reibun/Android/Nexus7/ >

・クリエイター手抜きプロジェクト
< http://www.openspc2.org/projectX/ >

・Adobe Illustrator CS3 + JavaScript 自動化サンプル集
< http://www.openspc2.org/book/PDF/Adobe_Illustrator_CS3_JavaScript_Book/ >
吉田印刷所の「印刷の泉」でも購入できるようになりました。