技術 iPhone  android アプリ開発 物理演算 OpenGLES 3D 自動化 プロジェクト管理 気になる技術、トレンドを書き連ねるところ。

2008年11月26日水曜日

Adobe JavaScript (JSX) 覚え書き

覚え書き。AdobeのjavaScriptで、PhotoShopが自動化できるらしい。
形式はAdobeによるJavaScript-eXtendらしく、.jsx。

調べてみると、これが結構強力。
やりたかった事は以下

1、フォルダ内の画像ファイルをすべて展開
2、切り出し位置が書いてある記述ファイルを別途読み込み、数値データ用意
3、数値データで画像を処理
4、指定フォルダに一括書き出し

できるとなー、ファイル更新とか素敵な時間削減になるんだ。

悩む事数時間、
、、、、で、でけた!

ワンクリックで数百枚の画像の最適化処理+アイコン作成+URLリンク作成が瞬殺ですよ。


詰まったのは、画像データ読み込みと、切り出しデータ読み込みの部分。
Adobe独自のJavaScriptAPIを使うのだけれど、情報が少ない。

1、画像ファイル展開
//open()
var folderName = "画像データ置き場";
var fileList = new Folder (folderName).getFiles ("*.*");
for ( docNo = 0; docNo < fileList.length; docNo ++ ) {
var fileRef = new File(fileList[docNo]);
open (fileRef);
}
コレで全部のデータが一気に開く。

2、記述ファイルの読み込み
//readIndexData()
var scriptfile = File.openDialog("読み込むファイルを選んでください","JSX-Script(*.jsx *.js):*.JSX;*.sJS;*.*");

if (scriptfile) {
var myOpenfile = new File(scriptfile);
myOpenfile.open("r");

var myContent;
for (i = 0; !myOpenfile.eof; i++) {
myContent += (myOpenfile.readln()+",");
}
}
データは、今のところExcel表→CSV出力で作成。","区切りでデータが出るのだが、テーブルの右ハジに関しては","が足されないという事が判明。流石だExcel、イライラさせてくれる。 己の無知だとしたら後で訂正。
readln()で読み込んで自分で","を足す。

悩ましかったのは最後のfor~部分。できるだけ適当なデータ形式(長さが不定)を読み込みたかったため、
eofで判定を入れてみた。 ウマー。JavaScript、適当ですな。


最後に、配列を用意し","でsplitした値を流し込んで、完了。
var fileName;
var itemNum = 6;
var alt = myContent.split (",");//カンマ抜きで、分割した文字数を出す
var itemLength = Math.floor(alt.length/itemNum);
fileName = new Array (itemLength);
for (j = 0; j < alt.length; j++) {
index = Math.floor(j/itemNum);
if (j%itemNum == 0) fileName[index]=alt[j];
}

3、画像処理(というか保存画像命名スタイル)
1の方法で画像を開くと、そのまま最前面にあるファイルからフォーカスがあたる。
PhotoShopでの処理は展開しないと動かない。

利点は、展開処理が一斉に行われるので時間効率とメモリ効率がいいこと。
ただし、
・開く順番はフォルダ内のファイル名依存となる。開く順が想定できないので、処理順が特定できない。
・管理するときに面倒くさいので、処理するファイル名は変えたくない。すぐミッシングしていやん。
・連番処理を考えると、画像を足すたびにガンガンずれて処理が嫌になるのが目に見えてる。

そこで、開いているドキュメントの名前を取得し、2で出たファイル名データfileNameと一致をとる。
一致したナンバーを出力ファイルにつける事で、記述ファイルの上から順についている番号で命名できる。

var docNoSum = documents.length; // 開いているファイルの合計数
var docNo; // カウンタ用変数
//Execute()
for ( docNo = 0; docNo < docNoSum; docNo ++ ) {//現在開いてるファイルカウント

var srcDoc = activeDocument; // 現在アクティブなドキュメント
var myName = srcDoc.name.split( "." )[0]; // ファイル名の取得

for (i = 0; i < fileName.length; i++) {
if (myName == fileName[i]) {
alert (myName+"_NameHIT!_"+fileName[i]+"/num_"+i);
contentNo = i;

saveName = "00"+contentNo; // ナンバリング
if (10 <= contentNo) saveName = "0"+contentNo;
if (100 <= contentNo) saveName = contentNo;
}
}

//saveNameが保存時のファイル名連番部分になる。やりたい処理を書く
}

うん、便利。
一致部分はかなりやっつけなので、αレベルのものという事で。
どうなんじゃろ。無駄だな。。 モノが1000枚とかになると、どっちにしてもPhotoShopが死ぬか。
再考の余地あり。


4、保存。 ここではJpegで保存
//createContents()
var saveFileJPG = new File("保存先フォルダ"+ saveName+".jpg" ); // 保存パスJPG

//JPEGで保存
var jpgSaveOpt = new JPEGSaveOptions(); // JPEG保存設定

jpgSaveOpt.quality = outQuality; // JPEGクオリティ
jpgSaveOpt.embedColorProfile = false; //埋め込みカラー設定
jpgSaveOpt.formatOptions = FormatOptions.OPTIMIZEDBASELINE;//フォーマット

srcDoc.saveAs( // 保存
saveFileJPG, // 保存パス
jpgSaveOpt, // JPEG保存設定
true, // 複製保存
Extension.LOWERCASE ); // 拡張子は小文字
以上。


コレ以外に、
・画像サイズを取得して選り分ける
・各辺の最大サイズを指定して、画像のアスペクト比を保ったまま縮小
・指定位置からroundRectのサムネイルを作る
・画像名と表示位置をリストとして出力
・htmlを出力
とかやってみた。 モジュール化して作る癖がついてきたので、複数jsxに分解したいですね。
チェーン形式のメソドが作れたらやってみよう。
それとサーバ越しの処理も。

0 件のコメント:

自己紹介