Potoshopで画像の座標位置をexportするScriptを作りました
Photosopを使ってる皆さん、画像(レイヤー別に)の位置を、テキストで出力したいって思ったことありませんか?
カーソルを合わせて、メモって、エクセル等のツールに入力して…ってシンドイですし、ヒューマンエラーを起こしやすいですよね?
何とか自動化できないものかと調べてみたら、見つけたましたよ、スクリプト。しかし、でもちょっと古いコードのようで、CC2020、CC2021でちゃんと実行されないようでした。
ので、ちょっとずつ検証しながら、コードを動くようにしてみました。
ダウンロードは ↓↓↓ コチラから。
Position_export.jsx
一緒にドキュメントも用意してありますが、ここでもスクリプトの仕様と、使い方を説明しておきます。
【座標位置を出力する準備】
座標を出力する画像のレイヤー名に[_pos]を追加します。
[_pos]が付いていないレイヤーは無視されます。
また、レイヤーフォルダー内にあるレイヤーは検知しません。
【スクリプトを実行する】
まず、Potoshop内で、ポジションを出力したいpsdを選択します。
次に、スクリプトを実行します。
[ファイル > スクリプト > 参照…]を選択します。
ファイルブラウザが開くので、[Position_export.jsx]を選択します。
ファイルを実行すると、以下のウインドウが表示されますので、問題が無ければ「はい」を選択して下さい。
以上で作業は終了です。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の拡張も、意外と作る方法があるんですねぇ。
今後、時間作って、色々と勉強してみるのもいいかもしれませんね。