まとめ
各部分に分割してスクリプトを記述していたので、最後にまとめてスクリプトを掲載しておきます。これまでの説明を参考にして、流れを追っていくと分かりやすいと思います。
//---------------------------------------------------------------------- //---------------------------------------- // // サイズを調整して保存 // //---------------------------------------- // 引数 :なし // 返り値:なし // 仕様 :画像には、縦長や横長のものがある。それらの画像を、指定す // るドット・サイズの長方形に入るようにリサイズする。 // 縦横比は保持する。 // サイズの指定次第で、拡大も縮小も可能。 // // outMaxW // ┌───┐ // │ │ // │ │outMaxH // │ │ // └───┘ // この枠にぴったり入るように、画像をリサイズする。 // // さらに指定クオリティのJPEGと、指定色数のGIFにして別名保存 // する。 // // 保存するファイル名は次のようになる。 // 保存先のフォルダは元のファイルと同じパスになる。 // 「元ファイル名_指定横サイズ_指定縦サイズ_クオリティ.jpg」 // 「元ファイル名_指定横サイズ_指定縦サイズ_色数.gif」 // // 本処理は、開いているファイルすべてに対して実行される。 // // 用途:画像をWeb上などで公開する際に、自由な大きさのサムネール // を作りたいときに使用する。 // //==== ユーザー変数の初期化 ======================================== // var outMaxW = 240; // 出力時の最大横幅 var outMaxH = 200; // 出力時の最大高さ var outQuality = 8; // JPEG出力時のクオリティ(0~12) var outColNo = 16; // GIF出力時の色数(2~256) //---------------------------------------------------------------------- //==== 変数の初期化 ================================================ // var docNoSum = documents.length; // 開いているファイルの合計数 var docNo; // カウンタ用変数 var strtRulerUnits = preferences.rulerUnits; // スクリプト実行前の単位系 //==== 単位系の変更 ================================================ // preferences.rulerUnits = Units.PIXELS; // 単位系をピクセルに //---------------------------------------------------------------------- //==== 開いているファイル全部に対して実行 ========================== // for ( docNo = 0; docNo < docNoSum; docNo ++ ) { //==== 変数の初期化 ============================================ // var srcDoc = activeDocument; // 現在アクティブなドキュメント var myPath = srcDoc.path + "/"; // フォルダのパスの取得 var myName = srcDoc.name.split( "." )[0]; // ファイル名の取得 var saveNameJPG = myName // 保存ファイル名JPG + "_" + outMaxW + "_" + outMaxH + "_" + outQuality; var saveFileJPG = new File( myPath + saveNameJPG ); // 保存パスJPG var saveNameGIF = myName // 保存ファイル名GIF + "_" + outMaxW + "_" + outMaxH + "_" + outColNo; var saveFileGIF = new File( myPath + saveNameGIF ); // 保存パスGIF var newW = 0; // 新規横幅 var newH = 0; // 新規高さ //---------------------------------------------------------------------- //==== コピー ================================================== // var x1 = 0; // X座標開始位置 var x2 = srcDoc.width; // X座標終了位置 var y1 = 0; // Y座標開始位置 var y2 = srcDoc.height; // Y座標終了位置 srcDoc.selection.select( // 選択範囲を作る Array ( // 配列で選択範囲を指定 Array( x1, y1 ), // 左上 Array( x2, y1 ), // 右上 Array( x2, y2 ), // 右下 Array( x1, y2 ) // 左下 ), SelectionType.REPLACE, // REPLACE(新規選択)以外には、 // 選択範囲に追加(EXTEND)、 // 選択範囲から削除(DIMINISH)、 // 現在の選択範囲との共通範囲(INTERSECT) // がある。 0, // ぼかしピクセル数 false); // アンチエイリアス srcDoc.selection.copy(); // 選択範囲をコピー //==== 貼り付け ================================================ // var pasteDoc = documents.add( // 新規ドキュメント追加 x2, // 横幅 y2, // 高さ srcDoc.resolution, // 元ドキュメントの解像度 "Paste Target" ); // 新規ドキュメント名 pasteDoc.paste(); // 貼り付け pasteDoc.flatten(); // レイヤー結合 //------------------------------------------------------------------ //==== 新規サイズの計算 ======================================== // // 縦を基準に縮小するか、横を基準に縮小するかを、その縦横比から // 判定して、新規サイズの横幅と高さを計算する。 // // 以下の計算式で、縦が大きいか横が大きいかを判定する。 // 「x2 / y2 >= outMaxW / outMaxH」 // 整数のみで計算するために、分数を掛け算に開く。 // 「x2 / y2 >= outMaxW / outMaxH」→ // 「x2 * outMaxH >= y2 * outMaxW 」 // if ( x2 * outMaxH >= y2 * outMaxW ) { //==== 横が長過ぎる(横を基準にリサイズ) ================== // newW = outMaxW; // 新規横幅 newH = y2 * outMaxW / x2; // 新規高さ } else { //==== 縦が長過ぎる(縦を基準にリサイズ) ================== // newW = x2 * outMaxH / y2; // 新規横幅 newH = outMaxH; // 新規高さ } //==== サイズの変更 ============================================ // pasteDoc.resizeImage( // サイズの変更 newW, // 横幅 newH, // 高さ pasteDoc.resolution, // 解像度 ResampleMethod.BICUBIC ); // 縮小形式 //------------------------------------------------------------------ //==== JPEGで保存 ============================================== // var jpgSaveOpt = new JPEGSaveOptions(); // JPEG保存設定 jpgSaveOpt.quality = outQuality; // JPEGクオリティ // その他 jpgSaveOpt.embedColorProfile = false; // 埋め込みカラー設定 jpgSaveOpt.formatOptions = FormatOptions.OPTIMIZEDBASELINE; pasteDoc.saveAs( // 保存 saveFileJPG, // 保存パス jpgSaveOpt, // JPEG保存設定 true, // 複製保存 Extension.LOWERCASE ); // 拡張子は小文字 //------------------------------------------------------------------ //==== モードをインデックス・カラーに変更 ====================== // var indxOpt = new IndexedConversionOptions(); // インデックス変換設定 indxOpt.colors = outColNo; // 色数 // 他の設定 indxOpt.forced = ForcedColors.NONE; indxOpt.matte = MatteType.NONE; indxOpt.palette = Palette.LOCALPERCEPTUAL; indxOpt.preserveExactColors = false; indxOpt.transparency = false; pasteDoc.changeMode( // カラー・モード変更 ChangeMode.INDEXEDCOLOR, // インデックス・モード indxOpt ); // インデックス変換設定 //==== GIFで保存 =============================================== // var gifSaveOpt = new GIFSaveOptions(); // GIF保存設定 gifSaveOpt.interlaced = false; // インターレースなし pasteDoc.saveAs( // 保存 saveFileGIF, // 保存パス gifSaveOpt, // GIF保存設定 true, // 複製保存 Extension.LOWERCASE ); // 拡張子は小文字 //------------------------------------------------------------------ //==== 貼り付けドキュメントを閉じる ============================ // pasteDoc.close( SaveOptions.DONOTSAVECHANGES ); // 変更を保存せずに閉じる pasteDoc = null; //==== 対象ファイルを閉じる ==================================== // srcDoc.close( SaveOptions.DONOTSAVECHANGES ); // 変更を保存せずに閉じる srcDoc = null; } //---------------------------------------------------------------------- //==== 単位系を戻す ================================================ // preferences.rulerUnits = strtRulerUnits;
また、画像ファイルと、実際にスクリプトを実行して出力したファイルも掲載しておきます。
おわりに
Photoshopは、豊富な機能と強力な処理能力を持っている非常に便利なアプリケーションです。このPhotoshopを道具として使いこなす方法の一つに、スクリプトによる制御があります。アクション機能では実現が難しい処理でも、スクリプト機能を使えば簡単に実現できます。この機能を使わない手はないでしょう。
また、こうやって作成したスクリプトをアクションとして登録し、ショートカットキーに割り当てることも可能です。そうすれば、例えば「[F2]キーを押すだけで、特定のスクリプトを実行する」といった使い方ができるようになります。うまく活用して、Photoshopをさらに便利に使いこなしてください。