なんちゃって鶯教

このページを印刷

PhotoShopのアクション処理を自動化する

Googleブックマークに登録
Yahoo!ブックマークに登録

スキャナでアルバム写真をスキャンして、PhotoShopの「角度を補正しての切り抜き」で写真を分割しました。

しかし、分割したファイル数がスキャンした写真毎に異なるために、「バッチ処理」を利用した保存方法が分かりません。

そこで、JavaScriptを利用して「一括保存」するスクリプトを作成しました。

用途

指定したフォルダの画像(*.bmp)全てに対して、PhotoShopに登録されたアクション("アクション 3", "セット 1")を適用して、指定したフォルダにJPGとして保存するスクリプト

アクションは適時作成してください。今回の場合は次の手順で作成します。

  • 1) 「アクションの作成」を開始
  • 2) 選択範囲で、画像の少し内側を選び [イメージ→切り抜き] を行う(スキャンの仕方によっては「角度を補正して切り抜き」が失敗するため)
  • 3) 切り分けたい画像を開き、[ファイル→自動処理→角度を補正して切り抜き]を実行

利用方法

  • (1) ファイルをダウンロード
  • (2) スクリプト上の4行~6行目を変更する
    • 4行目:処理したいファイルの拡張子(jpgの場合には"*.jpg"と記載する)
    • 5行目:処理したいアクション名を記述する
    • 6行目:処理したいアクションのセット名を記述する
  • (3) PhotoShopを起動する
  • (4) 「ファイル」→「スクリプト」→「参照」で保存しておいたスクリプトを選択
  • (5) 「処理したいファイルのあるフォルダ」を選択
  • (6) 「処理したファイルを保存したいフォルダ」を選択
  • (7) 自動的に処理が走ります

ソースコード

ダウンロード先はaction.jsxです。(UTF-8形式で保存)

/**
   ユーザの変更値(ユーザ毎に変更が必要)
**/
IMG_EXTENSION = "*.bmp";
ACTION_NAME   = "アクション 3";
SET_NAME      = "セット 1";

/**
   桁あわせ(0で埋める)
   @param   桁数
**/
Number.prototype.fillZero = function(n) {
   var r = this.toString().split('');
   while(r.length < n) {
      r.unshift('0');
   }
   return r.join('');
}

/**
   JPGで保存する
   @param   ファイル名
**/
function saveAsJPG( Name ) {
   var fileObj = new File( Name );
   var jpegOpt = new JPEGSaveOptions();
   jpegOpt.embedColorProfile = true;
   jpegOpt.quality = 12;
   jpegOpt.formatOptions = FormatOptions.PROGRESSIVE;
   jpegOpt.scans = 3;
   jpegOpt.matte = MatteType.NONE;
   activeDocument.saveAs(fileObj, jpegOpt, true, Extension.LOWERCASE);
   fileObj = null;
   jpegOpt = null;
}

/**
   登録済みのアクションを実行する。
   @param   Actn      アクション名
   @param   ActSet    アクションセット名
**/
function doAction( Actn, ActSet )
{
   var actRef = new ActionReference();
   actRef.putName( charIDToTypeID( "Actn" ), Actn );
   actRef.putName( charIDToTypeID( "ASet" ), ActSet );
   var actDesc = new ActionDescriptor();
   actDesc.putReference( charIDToTypeID( "null" ), actRef );
   executeAction( charIDToTypeID( "Ply " ), actDesc, DialogModes.NO );
   actRef = null;
   actDesc = null;
}

/**
   ファイルを閉じる
**/
function doFinsh() {
   activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}

/**
   フォルダを選択
**/
function selectFolder( Comment ) {
   var folderObj = Folder.selectDialog( Comment );
   return folderObj;
}

/**
   ファイルを開く
**/
function doOpen(fileName) {
   var fileRef = new File(fileName);
   open (fileRef);
   fileRef = null;
}

/********** PhotoShop向け ***************/
if (BridgeTalk.appName == "photoshop") {
   main();
}

function main() {
   var inPath = selectFolder("処理したいファイルが存在するフォルダを選択");
   var outPath = selectFolder("処理後のファイルを保存するフォルダを選択");
   var fileList = inPath.getFiles(IMG_EXTENSION);
   var i;
   for (i = 0; i < fileList.length; i ++) {
      // 元ファイルを保存する
      doOpen(inPath + "/" + fileList[i].name);
      saveAsJPG(outPath + "/" + i.fillZero(4) + ".jpg");
      while(documents.length) {
         // 開いたファイルにアクションを適用
         doAction(ACTION_NAME, SET_NAME);
         var num = 1;
         while(documents.length > 1) {
            // 分割されたファイルを保存する
            saveAsJPG(outPath + "/"  + i.fillZero(4) + "_" + num++ + ".jpg");
            doFinsh();
         }
         doFinsh();
      }
   }
}

まとめ

各関数の説明は今後行っていきますが、そのままコピーすれば使えると思います。