見出し画像

Potoshopで画像の座標位置をexportするScriptを作りました

Photosopを使ってる皆さん、画像(レイヤー別に)の位置を、テキストで出力したいって思ったことありませんか?
カーソルを合わせて、メモって、エクセル等のツールに入力して…ってシンドイですし、ヒューマンエラーを起こしやすいですよね?
何とか自動化できないものかと調べてみたら、見つけたましたよ、スクリプト。しかし、でもちょっと古いコードのようで、CC2020、CC2021でちゃんと実行されないようでした。
ので、ちょっとずつ検証しながら、コードを動くようにしてみました。

ダウンロードは ↓↓↓ コチラから。
Position_export.jsx

一緒にドキュメントも用意してありますが、ここでもスクリプトの仕様と、使い方を説明しておきます。

【座標位置を出力する準備】
座標を出力する画像のレイヤー名に[_pos]を追加します。
[_pos]が付いていないレイヤーは無視されます。
また、レイヤーフォルダー内にあるレイヤーは検知しません。

【スクリプトを実行する】
まず、Potoshop内で、ポジションを出力したいpsdを選択します。
次に、スクリプトを実行します。
[ファイル > スクリプト > 参照…]を選択します。

スクリプトの実行

ファイルブラウザが開くので、[Position_export.jsx]を選択します。

ファイルを実行すると、以下のウインドウが表示されますので、問題が無ければ「はい」を選択して下さい。

スクリプトの実行2

スクリプトの実行3

スクリプトの実行4

以上で作業は終了です。PSDファイルと同じところに
([psdファイルネーム].psd_expot.csv)
というファイルネームで.csvファイルが出力されます。
ファイルを開くと…

marker_pos.psd,square2_pos,554,601,square1_pos,132,227,

といった感じで
([filename].psd , レイヤー名 , 座標x , 座標y , …more)
と記述されたテキストがあるはずです。

以下にスクリプトのソースコードも公開しておきます。

/**
* position_exort.jsx
*感謝
*https://ishiotks.hatenablog.com/entry/2019/02/02/143259
* generator_png_layer_listup.jsx
*/
// 処理に該当する拡張子名の配列
//// 今回は png のみなので .png
//var extensions = [".png"];
var extensions = ["_pos"];
// 書き出す際のテキストを貯める変数
var strData = "";
// 以下処理 ///////////////////////////////////////////////////////
if( app.documents.length == 0 ){
   alert( "【!】実行するドキュメントがありません。" );
} else {
   main();
}
function main(){
   if(confirm( activeDocument.name + "から、pngのつくレイヤーから矩形抽出しますか?" )){
       section();
   }
   alert( "すべての処理が完了しました。お疲れ様でした。" );
   return "完了";
}
function section(){
   // ファイルを作成し、テキストレイヤー書き出し処理へ
   var fileName = activeDocument.fullName + "_export.csv";
   var file = new File(fileName);
   var openFlag = file.open("w");
   strData += activeDocument.name + ",";
   if(openFlag) {
       // 再帰的に処理
       allLayerSetsBounds( activeDocument );
       // CSVテキストの出力
       file.write(strData);
       file.close();
       // 完了
       alert("書き出しが完了しました。");
   } else {
       alert("ファイルが開けませんでした。");
   }
}
// レイヤー名に処理に該当する拡張子が含まれているか捜索する
function checkNameExtensions( name ) {
   var len = extensions.length;
   var ret = false;
   for (var i=0; i<len; i++){
       var checkName = extensions[i];
       if( name.indexOf(checkName) > -1 ){
           ret = true;
       }
   }
   return ret;
}

function getGeneratedLayersName( artLayers ) {
   var ret = [];
   var ns = artLayers.length;
   for (var i=0; i<ns; i++){
       var focusLayer = artLayers[i];
       if( checkNameExtensions( focusLayer.name ) ){
           ret.push( focusLayer.name );
       }
   }
   return ret;
}

function allLayerSetsBounds( layObj ){
   var n = layObj.artLayers.length;
   // レイヤーフォルダ内のレイヤー捜索 ////////////////////////////////////////
   // レイヤー名に処理に該当する拡張子が含まれているか捜索する
   var lList = getGeneratedLayersName(layObj.artLayers);
   // あれば1つ1つ捜索しテキスト生成しCSV用テキストへ連結
   var n = lList.length;
   if( n > 0 ) {
       for (var i = 0; i < n; i++) {
           var lname = lList[i];
           var focusLayer = layObj.artLayers.getByName(lname);
           var focusLayerArea = focusLayer.bounds;  // フォーカスエリアを取得
           var x1 = parseInt(focusLayerArea[0]);  // 左上 x座標
           var y1 = parseInt(focusLayerArea[1]);  // 左上 y座標
           var addStr = focusLayer.name + "," + x1 + "," + y1 + ",";  // テキスト生成
           strData += addStr;  // CSV用テキストへ連結
       }
   }
}

以上になりますが、基本的に私は、jsの勉強をしたことも、Photoshopのjsx関連のドキュメントも読んだことがありません。
じゃぁ、どうして動かせたのかというと、元のソースコードを、1行ずつコメントアウトして、エラーを起こしてるところを見つけたり、CSVの書き出しの内容を見比べたり、すっごく素人的なやり方で何とかしたって感じです。

いやー、Photoshopの拡張も、意外と作る方法があるんですねぇ。
今後、時間作って、色々と勉強してみるのもいいかもしれませんね。