SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Photoshopのスクリプト制御

JavaScriptを利用したバッチ処理によるサムネイル画像の自動生成

  • X ポスト
  • このエントリーをはてなブックマークに追加

まとめ

 各部分に分割してスクリプトを記述していたので、最後にまとめてスクリプトを掲載しておきます。これまでの説明を参考にして、流れを追っていくと分かりやすいと思います。

ResizeOut.jsまとめ
//----------------------------------------------------------------------
    //----------------------------------------
    //
    //    サイズを調整して保存
    //
    //----------------------------------------
    //  引数 :なし
    //  返り値:なし
    //  仕様 :画像には、縦長や横長のものがある。それらの画像を、指定す
    //      るドット・サイズの長方形に入るようにリサイズする。
    //      縦横比は保持する。
    //      サイズの指定次第で、拡大も縮小も可能。
    //
    //       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;

 また、画像ファイルと、実際にスクリプトを実行して出力したファイルも掲載しておきます。

元ファイル1 横長
元ファイル1 横長
元ファイル2 縦長
元ファイル2 縦長
出力ファイル1 横長 JPEG
出力ファイル1 横長 JPEG
出力ファイル2 横長 GIF
出力ファイル2 横長 GIF
出力ファイル3 縦長 JPEG
出力ファイル3 縦長 JPEG
出力ファイル4 縦長 GIF
出力ファイル4 縦長 GIF

おわりに

 Photoshopは、豊富な機能と強力な処理能力を持っている非常に便利なアプリケーションです。このPhotoshopを道具として使いこなす方法の一つに、スクリプトによる制御があります。アクション機能では実現が難しい処理でも、スクリプト機能を使えば簡単に実現できます。この機能を使わない手はないでしょう。

 また、こうやって作成したスクリプトをアクションとして登録し、ショートカットキーに割り当てることも可能です。そうすれば、例えば「[F2]キーを押すだけで、特定のスクリプトを実行する」といった使い方ができるようになります。うまく活用して、Photoshopをさらに便利に使いこなしてください。

参考資料

  1. Adobe - Photoshop

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/406 2006/06/12 00:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング