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; + } +} +);
ただし実際にやってみると、FireworksのPNGファイルを開くときに「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)
- 作者: IncAdobeSystems
- 出版社/メーカー: Adobe Pr
- 発売日: 2005-10-28
- メディア: ペーパーバック