Photoshopで表示レイヤーを結合し、レイヤー名をファイル名に変更する

Photoshopで、PSDの表示レイヤーを結合し、レイヤー名をファイル名に変更するJSX(Adobe JavaScript)を書きました。

ちょっと分かりにくいので具体例を挙げて説明すると、「hoge.psd」というPSDファイルがあったとき、そのレイヤー構造がどうなっていようと1つのレイヤーに結合した上で、そのレイヤー名を「hoge」に変更するというスクリプトです。

これが必要になるシチュエーションは珍しいので使いたい人がいるかどうか疑問ですが、せっかく書いたので公開しておきます。

ダウンロード

http://448.jp/blog/article/837/fileName2layerName.zip

使い方

ZIPを解凍したら、「fileName2layerName.jsx」というファイルが出てきます。これを2バイト文字がないファイルパスに置いて、Photoshopのファイル→スクリプト→参照から実行してください。

Windows / Photoshop CS3で作成、動作確認をしていますので、他の環境では動かないかもしれません。なにかありましたらコメント欄で教えてください。

注意点

  • スクリプトを実行するとダイアログを出さずにPSDを上書き保存して閉じます。必ずPSDのバックアップを取ってからお使いください。
  • ファイル名に2バイト文字があると、レイヤー名にはうまく反映されません。これはスクリプトがUTF-8で動作するのが原因っぽいです。回避方法をご存じの方は教えてください! 追記(2009/6/2):コメント欄で教えていただきました。現在はファイル名に2バイト文字があっても正常に動作するスクリプトに差し替えてあります。
  • 非表示レイヤーは削除されます。
  • PSDの置いてあるファイルパスに2バイト文字があると、うまく動かない可能性があります。 追記(2009/6/2):私の環境では動作しているようです。問題があれば教えてください。
  • At your own riskでお願いします。

スクリプトを書いた経緯

素材がパーツごと(テキスト、画像、通常時/ロールオーバー時のボタンなどなど)に分かれた大量のPSDファイルをFlashに読み込みたい、という状況になったのがきっかけです。ファイル数としては1,000個強。

PSDはファイルによって背景レイヤーのみだったり、階層のレイヤーグループがあったりで、レイヤー構造はバラバラ。そのままFlashに読み込むと、ライブラリにレイヤー数だけビットマップが増えまくってしまいます。

PSDインポーターでレイヤーを結合すればいいのですが、数が多すぎて面倒くさすぎる。しかもビットマップに付けられる名前は、「レイヤー 0」とかになってしまい、ウザイことこの上なし。

というわけで、せめて少しでもラクをしながら管理しやすい状態でFlashに読み込むために、スクリプトを書いたというわけです。

レイヤーが1枚しかないPSDは自動的に1つのビットマップとして読み込まれる(PSDの読み込み時はPSDインポーターのダイアログが必ず表示されてしまうので、OKボタンは押さなくてはいけない。これはEnterキーの連打でOKだし、それも面倒ならばPNGとかに変換してから読み込むといいかも)ので、このスクリプトを実行したPSDをFlashに一括で読み込むと、FlashのライブラリにはPSDの数と同じ、かつ名前も同じビットマップが読み込まれる、ということになります。

まぁしかしこんな回りくどいことをしなくても、1つのPSDないしはAIで素材があれば、それで解決なんですが……。

よろしければコメントをどうぞ!

匿名希望のコメントはこちらへ

通りすがり 2009年6月 2日 15:58

下記の様にすると一応日本語に対応できます。

---------------------------------------------------------------
var myDoc = activeDocument;
var myFullpath = activeDocument.fullName.fsName.toString();
myPath = activeDocument.path.fsName.toString();
myPath =myPath+"\\"

// レイヤーを作成
myDoc.artLayers.add();
// 表示レイヤーを結合
myDoc.mergeVisibleLayers();
// 非表示レイヤーがあれば
if ( myDoc.layers.length > 1 ) {
for ( var i = 0; i < myDoc.layers.length; i++ ) {
if ( myDoc.layers[i].visible == false ) {
// 非表示レイヤーを削除
myDoc.layers[i].remove();
i--;
}
}
}

// 拡張子をカット
var targetName = myFullpath.substring(0, myFullpath.lastIndexOf("."));
//ファイル名を抽出
var targetName =targetName.replace(myPath,"");

// レイヤー名を変更
myDoc.layers[0].name = targetName;

// 保存して閉じる
//myDoc.close(SaveOptions.SAVECHANGES);

オキ 2009年6月 2日 17:18

ちょっと整理してこんな感じにしました。
記事にも反映させたいと思います。ありがとうございます!

// アクティブドキュメントを取得
var myDoc = activeDocument;

// レイヤーを作成
myDoc.artLayers.add();
// 表示レイヤーを結合
myDoc.mergeVisibleLayers();
// 非表示レイヤーがあれば
if ( myDoc.layers.length > 1 ) {
for ( var i = 0; i < myDoc.layers.length; i++ ) {
if ( myDoc.layers[i].visible == false ) {
// 非表示レイヤーを削除
myDoc.layers[i].remove();
i--;
}
}
}

// フルパスを取得(ファイル名を含む)
var myFullPath = myDoc.fullName.fsName.toString();
// パスを取得(ファイル名を除く)
var myPath = myDoc.path.fsName.toString() + "\\";
// 拡張子をカット
var targetName = myFullPath.substring(0, myFullPath.lastIndexOf("."));
// パスをカット
targetName = targetName.replace(myPath, "");

// レイヤー名を変更
myDoc.layers[0].name = targetName;

// 保存して閉じる
myDoc.close(SaveOptions.SAVECHANGES);

Comment Form

Trackbacks:0

TrackBack URL for this entry
https://448.jp/cgi-bin/mt/bnq48cke.cgi/820
Listed below are links to weblogs that reference
Photoshopで表示レイヤーを結合し、レイヤー名をファイル名に変更する from 448.jp blog

この記事はいかがでしたか?

ぜひ共有してみてください。あなたのフィードバックが、私のモチベーションにつながります。

×