Photoshop で JavaScript

アイコンとか小さな画像を複数編集したいとき、アイコンごとのファイルで1つずつ編集するのなんて面倒。それが100個もあった場合には1つのファイルでまとめて作って書き出すときにバラバラにしたい。

かといって、100個のファイルを開いて100回ペーストするのも、それはそれで面倒と思うのはこれもまた人の世の常。
わがままですね。

そんなわがままな悩みを解決するには自動化すればいいのですが、どういう方法で自動化させるかが問題。
せっかくなので割と慣れてる JavaScript でやる方法をちょっとやってみた。

まずは取り込みたい画像のパスが書かれたファイルを作る。
一行一ファイルを絶対パスで書く。

Mac & Phososhop CS2 の場合だと、
/Users/hoge/Desktop/images/hoge0.png
/Users/hoge/Desktop/images/hoge1.png

以下続く
…な感じのファイルを用意します。

スクリプトは以下の感じでファイルリストのパスをこれも絶対パスで教えてあげて、ExtendScript Toolkit.app を使って実行。
Photoshop からだと「ファイル」>「スクリプト」>「参照…」で javascript のファイルを渡してあげるとできます。

preferences.rulerUnits = Units.PIXELS;
var docObj = activeDocument;
var margin = 10;
var iconsize = 16;
var span = iconsize + margin
var w = activeDocument.width.value;
var h = activeDocument.height.value;
var num_max_x = Math.floor(w/span);
var num_max_y = Math.floor(h/span);
var filename = "/path/to/filename.txt";
var fileObj = new File(filename);
var flag = fileObj.open("r");

if (flag) {
    var lineCount = 0;

    while (!fileObj.eof) {
        textln = new File(fileObj.readln());
        if (textln.exists) {
            open(textln);
            activeDocument.selection.selectAll();
            activeDocument.activeLayer.copy();
            activeDocument.close(SaveOptions.DONOTSAVECHANGES);
            docObj.paste();

            var x = lineCount%num_max_x;
            var y = Math.floor(lineCount/num_max_x);

            activeDocument.activeLayer.translate(
              span*x - Math.ceil(w/2) + iconsize/2 + margin,
              span*y - Math.ceil(h/2) + iconsize/2 + margin
            );

            var fileNameAry = String(textln).split("/");
            var fileName = fileNameAry[fileNameAry.length-1];
            activeDocument.artLayers[0].name = fileName;
            lineCount ++;
        }
    }
}
else{
    alert("ファイルが開けませんでした");
}

せっかくなので動画撮ってみました。
始まりがグレーなのは何故だか分からない。

初めての Broadcast Myself.

コメントを記入