SHOEISHA iD

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

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

特集記事

Photoshopのスクリプト制御

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

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

スクリプト作成5 ~ 画像のコピー、新規ウィンドウへの貼り付け

 次は「画像のコピー」と、「新規ウィンドウへの貼り付け」です。「画像のコピー」では、選択範囲を作成して画像をコピーします。「新規ウィンドウへの貼り付け」では、新しいウィンドウを作成して、先ほどコピーしたファイルを貼り付けます。どちらも、方法さえ覚えてしまえば簡単な処理です。

画像のコピー、新規ウィンドウへの貼り付け
//==== コピー ==========================================================
//
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();            // レイヤー結合

 まずは「画像のコピー」について少し解説が必要でしょう。選択範囲は点の配列で指定します。各点は、X座標、Y座標を持った、配列数2の配列になります。Array( x1, y1 )と指定している部分が、各点の配列です。

 選択の種類は、SelectionTypeで指定します。新規に選択範囲を作成する場合はSelectionType.REPLACE、選択範囲に追加したい場合はSelectionType.EXTEND、選択範囲から削除したい場合はSelectionType.DIMINISH、現在の選択範囲との共通範囲を作成したい場合はSelectionType.INTERSECTと指定します。

 この選択範囲と、選択の種類をうまく使えば、自在に画像をトリミングすることができます。覚えておくとよいでしょう。

 次は、「新規ウィンドウへの貼り付け」です。documents.add()メソッドで新規のウィンドウを作成することができます。返り値は、新しく作成したウィンドウ自身になります。貼り付けはpaste()メソッドです。貼り付けられた画像は新規レイヤーとなってしまうので、flatten()メソッドでレイヤーを結合しています。

スクリプト作成6 ~ 新規サイズの計算、リサイズ

 新しく作成した画像を、ユーザー変数で指定した横幅と高さに収まるようにリサイズします。シンプルな処理です。

新規サイズの計算、リサイズ
//==== 新規サイズの計算 ================================================
//
// 縦を基準に縮小するか、横を基準に縮小するかを、その縦横比から
// 判定して、新規サイズの横幅と高さを計算する。
//
// 以下の計算式で、縦が大きいか横が大きいかを判定する。
// 「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 );    // 縮小形式

 resizeImage()で画像のサイズを変更します。

 pasteDoc.resolutionという部分に関して少し説明をしておきます。これは、サイズ変更後の画像の解像度を、pasteDocの元々の解像度であるpasteDoc.resolutionと同じ値にするという意味です。こうしておけば、解像度を固定したまま、横幅と高さだけを変えることができます。

スクリプト作成7 ~ JPEGで保存

 作成した画像をJPEGで保存します。その際に、画像のクオリティなどのJPEG固有の設定を、プログラムで指定してから保存します。

JPEGで保存
//==== 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 ); // 拡張子は小文字

 new JPEGSaveOptions()としてJPEG保存設定を作成します。そして、各プロパティを書きかえて設定を決めます。outQualityは、JPEGクオリティを指定するユーザー変数です。プロパティの指定後、「変数の初期化」の項で作成したsaveFileJPGを保存パスとし、jpgSaveOptを保存設定としてファイルを保存します。

 Extension.LOWERCASEとして、拡張子を小文字にしています。ここで拡張子を指定するので、保存パスには拡張子を記述する必要がありません。

スクリプト作成8 ~ GIFで保存

 次はGIFで保存します。GIFはインデックス・カラー(パレット情報を持った画像)なので、いったん減色してから保存しています。

 さらに、新しく作成したウィンドウを閉じ、画像のコピー元のウィンドウも閉じます。

 この項で、各ファイルに対する「実際の処理」は終了です。分かりやすいように、「繰り返し処理」の末尾の閉じ括弧も付けておきます。

GIFで保存
    //==== モードをインデックス・カラーに変更 ==========================
    //
    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;
}

 まずはモードをインデックス・カラーに変更します。new IndexedConversionOptions()として「インデックス変換設定」を作成し、各プロパティを指定して設定を決めます。outColNoは、GIFの色数を指定するユーザー変数です。プロパティの指定後、changeMode()メソッドを使って、画像をインデックス・カラーに変換します。

 GIFの保存はJPEGの保存と同じです。違う点は、JPEG保存設定JPEGSaveOptions()ではなく、GIF保存設定GIFSaveOptions()を使う点だけです。

 最後に、ウィンドウを閉じます。SaveOptions.DONOTSAVECHANGESと引数を設定することで、ファイルの保存確認を行うウィンドウを出さずにウィンドウを閉じることができます。

 以上で、処理は終わりです。

次のページ
まとめ

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

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

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング