ESTKの学習(2) PhotoshopをJSで操作する

[話者] ESTK (ExtendScript Toolkit)を使って Photoshopを操作してみるぞ。
ESTKは PhotoshopCS2から搭載されたのだが、ここではCS3で使用する。


[合いの手] わざわざJavaScriptを書くことでどんなすごいことができるんだい?


[話者] まずはサムネイル画像作成スクリプトを作ってみた。

//for PhotoshopCS3
preferences.rulerUnits = Units.PIXELS;

//サムネイルの最大サイズ max pixels
maxpx = 160;
//サムネイルを保存するフォルダ名。このスクリプト実行時に聞かれるフォルダの下に作成する。
thumbDir = 'thumbnail';

//特定のフォルダ以下のすべてのJPGを開く
var dirObj = Folder.selectDialog("フォルダを選択せよ");
var files = dirObj.getFiles("*.jpg");

for(var i=0; i<files.length; i++){
    //ファイル開く
    var theDoc = app.open(files[i]);
    theDoc.changeMode(ChangeMode.RGB);

    //リサイズする
    var w = theDoc.width.value;
    var h = theDoc.height.value;
    if(w > h && w > maxpx){
        theDoc.resizeImage(maxpx, h*(maxpx/w), 72, ResampleMethod.BICUBICSHARPER);
    }else if(h >= w && h > maxpx){
        theDoc.resizeImage(w*(maxpx/h), maxpx, 72, ResampleMethod.BICUBICSHARPER);
    }

    //保存する
    var newDir = new Folder(theDoc.path +'/'+ thumbDir);
    if(! newDir.exists){ newDir.create();}
    var newFile = new File(theDoc.path +'/'+ thumbDir +'/'+ theDoc.name);
    var jpegopt = new JPEGSaveOptions();
    jpegopt.quality = 7; //0(low)〜12(high);
    theDoc.saveAs(newFile, jpegopt, true);
    theDoc.close(SaveOptions.DONOTSAVECHANGES);
}


[合いの手] 画像を縮小するだけならわざわざJavaScript書かなくても、アクション+バッチで できるよ。どこにJavaScript使う必要があるんだ?


[話者] これはだな、画像の縦幅と横幅を調べて、以下の3とおりのケースによって条件分岐している、という点が単なるアクションとはちがう。

  • 縦幅>横幅で、縦幅がサムネイル最大値(ここでは160px)より大きい → 縦幅が160pxになるよう縮小
  • 横幅>=縦幅で、横幅がサムネイル最大値(ここでは160px)より大きい → 横幅が160pxになるよう縮小
  • それ以外(縦幅も横幅もサムネイル最大値(ここでは160px)より小さい)→ 縮小しない


[合いの手] なるほど。「画像の大きさ」で場合分けするために、JavaScript使っているわけか。

JPGファイルだけしか開けないのかい?


[話者] いや、フォトショップで開けるファイルならすべて開くようにできるが……スクリプトをこう変更すれば GIF や PNG も開けるようになる。正規表現のところを追加すれば、ほかの画像形式でも対応できる。

 var dirObj = Folder.selectDialog("フォルダを選択せよ");
-var files = dirObj.getFiles('*.jpg');
+var files = dirObj.getFiles(function(thefile){
+       var regex = /(\.jpg|\.jpeg|\.gif|\.png|\.psd|\.tiff?|\.ai|\.bmp)$/i;
+       if(regex.test(thefile.name)){
+               return true;
+       }else{
+               return false;
+       }
+}
+);


ただし実際にやってみると、FireworksPNGファイルを開くときに「Fireworksデータが見つかりました」というダイアログが出てきて一時停止する。スペースバー押すなどすれば続行するが、自動処理が一時的にとまるのは残念だ。このダイアログ出現を抑制する方法は分からなかった。


あと、Adobe Illustratorの aiファイルも自動でサムネイル画像にできるんだが、ファイルによっては不可解なところで「Error 8103: ファイルはまだ保存されていません」というエラーが出て停止してしまう。これも解決策が分からない。


[合いの手] どうすればこのスクリプトを実行できるんだっけ?



[話者] PhotoshopCS3なら、3つ方法がある。一つ目は以下のESTKを起動して、

スクリプトをコピーペーストする、またはファイルを読み込んで、

再生ボタンを押す または[F5]キーを押せば実行できる。


二つ目は、スクリプトを jsxという拡張子をつけて保存する。[ファイル - スクリプト - 参照] で jsxファイルを開くと実行される。


三つ目は、'C:\Program Files\Adobe\Adobe Photoshop CS3\プリセット\スクリプト'に jsxファイル(ここでは pscs3-09.jsx)を置いて、Photoshopを再起動する。すると、[ファイル - スクリプト] にそのスクリプトが出てくるので通常のコマンドのように扱える。



PhotoshopCSでもこのスクリプト動かすことができるぞ。CSでは ESTKがないので一つ目の手段はとれないが、二つ目、三つ目の手段ならOKだ。……あれ? PhotoshopCSなら aiもFireworksPNGも、問題なく停止せずに処理できてしまった。なんでだろ?


[合いの手] CS3はよけいなエラーをひろってしまうのか……ふーん。

ところでこういうスクリプトってどう作るの?


[話者] ESTKの[ヘルプ - PhotoshopCS3 Library] を見てメソッドとプロパティを調べながら作った。どうも操作しにくい感じがあるけどな…。


以下のサイトも参考にさせてもらった。
Adobe Photoshop CS3自動化作戦」 http://www.openspc2.org/book/PhotoshopCS3/


正規表現は「RegExp - Mozilla developer center」も参考にした。
https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Global_Objects/RegExp



Adobe Photoshop Cs2 Official Javascript Reference (Visual Quickstart Guides)

Adobe Photoshop Cs2 Official Javascript Reference (Visual Quickstart Guides)

  • 作者: IncAdobeSystems
  • 出版社/メーカー: Adobe Pr
  • 発売日: 2005-10-28
  • メディア: ペーパーバック