KINOKO WEB

きのこ関係です。ときどき植物。

スクリプト Merge_HeZe

2016-01-30 | 画像処理
// ***************************************************************************************************************
// ソース画像にスタック画像のレイヤーをコピーします。
// 作成日 2015/2/14
// 変更日 2016/1/26
// Zerene Stacker と Helicon Focus の両方のスタック画像に対応しました。
// フォルダ名の前後に@をついたフォルダを識別します。
// スタック画像の名前は、ソース画像名 + 半角スペース + メソード名
//  親フォルダ
//  ∟作業フォルダ : @000@
//    ∟Main画像 : X2_00000.tif
//    ∟Focused
//      ∟B(2 4)画像 : X2_00000 B,Radius2,Smoothing2.tif
//      ∟B(4 8)画像 : X2_00000 B,Radius4,Smoothing8.tif
//  D:ZereneImages
//  ∟DMap画像 : IMG_1254 DMap.tif
//  ∟PMax画像 : IMG_1254 PMax.tif
// ***************************************************************************************************************

// ドキュメント数が1以上のときに実行します。
if (documents.length>=1){
// アクティブドキュメントを格納します。
var mainDocu = activeDocument
// 作業フォルダパスを格納します。
var wFPath = mainDocu.path
// 作業フォルダ名を格納します。
var wFName = wFPath.name
// ZereneImagesフォルダパスを格納します。
var zSPath = new Folder("/d/ZereneImages")

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  マスク作業の完了したドキュメントで、
//  レイヤーを統合して、Photoshopデータで保存します。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// レイヤー0の名前を格納します。
var layName = mainDocu.artLayers [0].name
//  名前の先頭と最後の文字を格納します。
var aDDDa = layName.charAt(0) + layName.charAt(layName.length-1)
// レイヤー0の名前の先頭と最後の文字が@のときに実行します。
if (aDDDa=="@@"){
  // =======================================================
  // ”@000@”フォルダがあれば、フォルダ内のファイルと作業フォルダを削除します。
  // フォルダ名の先頭と最後の両方に@があったら、作業フォルダ有りです。
  // =======================================================
  // 作業フォルダ名の先頭と最後の文字を格納します。
  var a000a = wFName.charAt(0) + wFName.charAt(wFName.length-1)
  // "@@"だったら実行します。
  if (a000a == "@@"){
    // ZereneImagesフォルダのTIFF画像をリストします。
    var fileList = zSPath.getFiles("*.tif");
    // メイン画像名を格納します。
    mainName = activeDocument.name.split(".");
    mainName = mainName[0];
    // メイン画像名を含んだTIFF画像を削除します。
    for(i=0;i<fileList.length;i++){
      if (fileList[i].name.search(mainName)>=0){new File(fileList[i]).remove()};
    }
    // Focusedフォルダのファイルをリストします。
    var fileList = new Folder(wFPath + "/Focused").getFiles();
    //  Focusedフォルダ内のすべてのファイルを削除します。    
    for(i=0;i<fileList.length;i++){new File(fileList[i]).remove()};
    // 作業フォルダのファイルをリストします。
    var fileList = wFPath.getFiles();
    //  作業フォルダ内のすべてのファイルを削除します。    
    for(i=0;i<fileList.length;i++){new File(fileList[i]).remove()}
    //  作業フォルダを削除します。
    //new File(wFPath).remove()
    wFPath.remove()
    //  親フォルダパスを格納します。
    var wFPath = wFPath.parent
  }
  // =======================================================
  // 名前に"のコピー"を含むレイヤーは非表示にします。他は表示します。
  // =======================================================
  for(i=0;i<mainDocu.artLayers.length;i++){
    // layName = mainDocu.artLayers[i].name;
    searchCount = mainDocu.artLayers[i].name.search(/のコピー/g);
    if (searchCount >= 0){jadge = false} else {jadge = true};
    mainDocu.artLayers [i].visible = jadge;
  }
// =======================================================
// 画像を統合します。
// =======================================================
var idFltI = charIDToTypeID( "FltI" );
executeAction( idFltI, undefined, DialogModes.NO );

// =======================================================
// 親フォルダにフォトショップ画像を保存します。
// =======================================================
// 拡張子を削除したファイル名を格納します。
var docName = mainDocu.name.split(".");
// フォトショップ形式で保存します。
psdSave (wFPath+"/"+docName[0]+".psd");
// ファイルを閉じます。
mainDocu.close(SaveOptions.DONOTSAVECHANGES);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ソース画像を開きます。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  // フォルダ内のファイル一覧を取得します。
  var fileList = wFPath.getFiles();
  // フォルダ内の全ファイル数を格納します。
  var fileLength = fileList.length;

  for (i=0; i<fileLength; i++) {
    // フォルダのパスを格納します。
    wFPath = fileList[i];
    // フォルダ名を格納します。
    fName = wFPath.name
    // フォルダ名の先頭と最後の文字を格納します。
    var a000a = fName.charAt(0) + fName.charAt(fName.length-1)
    // フォルダ名の先頭と最後の文字が@のとき実行します。
    if (a000a == "@@") {
      // TIFF画像をリストします。
      TiffList = wFPath.getFiles("*.tif");
      // ソース画像をひらきます。
      open (new File(TiffList[0]));
      // ループをぬけます。  
      break;
    }
  }
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// マスク作業をスタンバイ状態にします。
// スタック画像を、メイン画像のレイヤーに移動します。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ドキュメント数が1以上のときに実行します。
if (documents.length>=1){
  // アクティブドキュメントを格納します。
  mainDocu = activeDocument
  if (mainDocu.artLayers.length == 1){
    // 0のときは、レイヤーのコピーとマスクを実行しません。
    jadge = 0;
    // アクティブドキュメントのパスを格納します。
    folderPath = mainDocu.path;
    // Helicon Focus画像を処理します。
    // Focused フォルダのスタックしたTIFF画像をリストします。
    StackList = new Folder(folderPath + "/Focused").getFiles("*.tif");
    // 順序を反転します。
    StackList.reverse();
    // 画像数を格納します。
    StackLength = StackList.length;
  
    // Helicon Focus画像を処理します。
    for (i=0; i<StackLength; i++){
      stackLayerOpen (i, jadge);
      jadge = jadge + 1;
    }

    // Zerene Stacher画像を処理します。
    // /d/ZereneImagesフォルダのスタックしたTIFF画像をリストします。
    StackList = zSPath.getFiles("*.tif");
    // メイン名を格納します。
    mainName = mainDocu.name.split(".");
    mainName = mainName[0];
    // 画像数を格納します。
    StackLength = StackList.length;

    for (i=0; i<StackLength; i++){
      // スタック名を格納します。
      StackName = StackList[i].name;
      // スタック名をスペース文字で分割します。
      StackName = StackName.split("%");
      // スタック名にメイン名を含んでいるいる画像を処理します。
      if (StackName[0] == mainName){
        stackLayerOpen (i, jadge);
        jadge = jadge + 1;
      }
    }
    // スタック画像処理を1回以上おこなったら実行します。
    if (jadge > 0){
      // レイヤー0の名前を変更します。前後に@をつけます。
      activeDocument.artLayers[0].name = "@" + activeDocument.artLayers[0].name + "@";
      // レイヤー数-1 を格納します。
      layersNum = activeDocument.artLayers.length - 1;
      // 一番下のレイヤーを削除します。
      activeDocument.artLayers[layersNum].remove();
      //
      for (i=0; i<(layersNum - 1) / 2; i++){
        // コピーしたレイヤーを非表示にします。
        activeDocument.artLayers[i * 2].visible = false;
      }
      // 下から2番目のレイヤーをアクティブにします。
      activeDocument.activeLayer = activeDocument.artLayers[layersNum-2];
      // レイヤーマスクを選択します。
      layerMaskSelect ();
    }
  }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Photoshop形式で保存します。psdPathは、ファイルパスを指定します。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function psdSave (psdPath){
fileObj = new File(psdPath);
psdOpt = new PhotoshopSaveOptions();
psdOpt.alphaChannels = true;
psdOpt.annotations = true;
psdOpt.embedColorProfile = true;
psdOpt.layers = true;
psdOpt.spotColors = true;
activeDocument.saveAs(fileObj, psdOpt, true, Extension.LOWERCASE);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ビープ音を鳴らし、Brigeを表示します。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function showBrige (){
app.beep (); //ビープ音を鳴らします。
var idshowFileBrowserPalette = stringIDToTypeID( "showFileBrowserPalette" );
var desc1 = new ActionDescriptor();
var idMxm = charIDToTypeID( "Mxm " );
desc1.putBoolean( idMxm, false );
var idNwVw = charIDToTypeID( "NwVw" );
desc1.putBoolean( idNwVw, false );
executeAction( idshowFileBrowserPalette, desc1, DialogModes.NO );
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// アクティブレイヤーのマスクを選択します。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function layerMaskSelect (){
 var idslct = charIDToTypeID( "slct" );
var desc2 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref1 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idChnl = charIDToTypeID( "Chnl" );
var idMsk = charIDToTypeID( "Msk " );
ref1.putEnumerated( idChnl, idChnl, idMsk );
desc2.putReference( idnull, ref1 );
var idMkVs = charIDToTypeID( "MkVs" );
desc2.putBoolean( idMkVs, false );
  executeAction( idslct, desc2, DialogModes.NO );
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// スタック画像を開いてメインドキュメントにレイヤーをコピーします。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function stackLayerOpen (imageNumber, jadgeMask){
    // 画像を開きます。
    open (new File(StackList[imageNumber]));
    // メソード名を格納します。
    LayerName = activeDocument.name.split(" ");
    LayerName = LayerName[1].split(".");
    LayerName = LayerName[0];
    // レイヤーをコピーします。
    activeDocument.artLayers[0].copy();
    // アクティブドキュメントを閉じます。
    activeDocument.close(SaveOptions.DONOTSAVECHANGES);

    // メインドキュメントをアクティブにします。
    activeDocument = mainDocu;
    // レイヤー0 をアクティブにします。
    activeDocument.activeLayer = activeDocument.artLayers[0];
    // レイヤーを貼り付けます。
    activeDocument.paste();
    // 複製したレイヤー名前をメソードにします。
    activeDocument.artLayers[0].name = LayerName ;
    // ループ初回以外は実行します。
    if (jadge > 0){
      // レイヤーを複製します。
      activeDocument.artLayers[0].duplicate();
      // 2番目のレイヤをマスクします
      layerMask ();
    }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// レイヤーをマスクします。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function layerMask (){
var idMk = charIDToTypeID( "Mk " );
var desc2 = new ActionDescriptor();
var idNw = charIDToTypeID( "Nw " );
var idChnl = charIDToTypeID( "Chnl" );
desc2.putClass( idNw, idChnl );
var idAt = charIDToTypeID( "At " );
var ref1 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idChnl = charIDToTypeID( "Chnl" );
var idMsk = charIDToTypeID( "Msk " );
ref1.putEnumerated( idChnl, idChnl, idMsk );
desc2.putReference( idAt, ref1 );
var idUsng = charIDToTypeID( "Usng" );
var idUsrM = charIDToTypeID( "UsrM" );
var idHdAl = charIDToTypeID( "HdAl" );
desc2.putEnumerated( idUsng, idUsrM, idHdAl );
executeAction( idMk, desc2, DialogModes.NO );
}