2013年6月16日日曜日

マスクレイヤーをランダムにして、順を追ってパラパラ漫画風の画像が書き出せるjsxかいた(photoshop用)

色々とわけあって、日曜プログラマをしました。
とはいってもjsxで、そんな重たいものでもないのですが。。

【概要】
用途は、psdでパズルのようなマスクのレイヤーを作成して、それを順をおってpngに書きだしていくようなものです。

例えば10ピースのマスクレイヤーを作成したら、
1のレイヤーマスク書き出しpng

1と2のレイヤーマスク書き出しpng

1と2と3のレイヤーマスク書き出しpng
↓↓
↓↓
1~10のレイヤーマスク書き出しpng

が作成されて、パラパラ漫画風アニメーションができるというわけです。

【使い方】
例によって、以下ソースをjsxで保存。
ソースのコピーは、syntaxHighliter上でコードをダブルクリックしてください。
■win
C:¥Program Files¥Adobe¥Adobe Photoshop CS3¥プリセット¥スクリプト¥
■mac
/Applications/Adobe Photoshop CS3/プリセット/スクリプト/
にjsxファイルをつっこんで、photoshopを起動。

■!!注意点
"itao_パズルの書き出し"は破壊的なので、必ずそのレイヤーセットのバックアップをとっておいてください。
対象レイヤーセットを選択して
ファイル > スクリプト > "itao_パズルマスクのランダム(※jsxのファイル名になります)"
ファイル > スクリプト > "itao_パズルの書き出し(※jsxのファイル名になります)"

【その他】
今回利用するのがpng24だったので、それ以外の書き出しはせっていしていません(´ρ`)
これつかってなにか起きても責任はおえないので、それでもいいよって方もしくはソース眺めるのみに利用してくださいませ(´ρ`)
ランダムのうまい書き方をしらないので、フォークしてくれるお方、またjsx系で良い感じの技術があって教えていただける心優しいおかたがいらっしゃればとってもうれしいです!

 
var BASE_NAME = "base";

var puzzuleApp = function(){};
puzzuleApp.prototype = {

 allLayerShuffle : function(){
  var 
  _dName = activeDocument.activeLayer.name,
  _dObjects = activeDocument.layerSets[_dName],
  _dObjectsLength = _dObjects.artLayers.length
  ;

  _dObjects.layers[BASE_NAME].move(_dObjects , ElementPlacement.PLACEAFTER);
  for (var i = 0 ; i < _dObjectsLength ; i += 1){
   var 
   _rnd = Math.floor(Math.random() * (_dObjectsLength - 1)),
   _rnd2 = Math.floor(Math.random() * 2)
   ; 

   if(_rnd2 == 0){
    //一番上へ
    _dObjects.layers[_rnd].move(_dObjects , ElementPlacement.PLACEATBEGINNING);
   }else if(_rnd2 == 1){
    //一番下へ
    _dObjects.layers[_rnd].move(_dObjects , ElementPlacement.PLACEATBEGINNING);
   }else{
    //そのまま
    //
   } 
  }

  //細かい処理
  //baseレイヤーを一番上へ
  activeDocument.artLayers[BASE_NAME].move(_dObjects , ElementPlacement.PLACEATBEGINNING);
  //並び順を番号順にしなくていいか

 }
}

var myObj = new puzzuleApp ();
myObj.allLayerShuffle();

 
/* ▼めも▼ */
/*
activeDocument : 開いているpsdファイル
activeDocument.activeLayer : 選択しているレイヤーのオブジェクト
activeDocument.LayerSets["String"] : 開いているドキュメントのレイヤーセットオブジェクト
*/
/* ▲めも▲ */

//
//定数
//
var BASE_NAME = "base";
var SAVETYPE_PNG24 = "png24";


//
//処理
//
var itaoGlobalObject = function(){};
itaoGlobalObject.prototype = {
 getSaveDialogPath : function(){
  var 
  _folderName,
  _folderObj,
  _folderPath
  ;

  _folderName = Folder.selectDialog("保存するフォルダを選択してください");
  _folderObj = new File(_folderName);
  _saveFolderPath = _folderObj.fsName;

  return _saveFolderPath;
 },
 savePng : function(path, name, bit){
  var 
  _exp = new ExportOptionsSaveForWeb(),
  _fileObj
  ;
  _exp.format = SaveDocumentType.PNG;
  _exp.interlaced = false;

  if(bit == 8){
   _exp.PNG8 = true;
  }else{
   _exp.PNG8 = false;
  }
  _fileObj = new File(path + name + ".png", "png");
  activeDocument.exportDocument(_fileObj, ExportType.SAVEFORWEB, _exp);
 }
};



var puzzuleApp = function(v){
 this.myGlobal = v.gObj;
 this.saveDir = this.myGlobal.getSaveDialogPath();
};

puzzuleApp.prototype = {

 allLayerSave : function(v){
  //最後のアウトプット
  var 
  _dName = activeDocument.activeLayer.name,
  _dObjects = activeDocument.layerSets[_dName],
  _dObjectsLength = _dObjects.artLayers.length,
  _saveType = v.saveType
  ;

  if(this.saveDir != "/null"){
   for(var j = 0 ; j < _dObjectsLength ; j += 1){
    //初回のみ一度すべて非表示
    _dObjects.layers[j].visible = false;
   }
   _dObjects.layers[BASE_NAME].visible = true;
   _dObjects.layers[1].visible = true;


   for (var i = 1 ; i < _dObjectsLength ; i += 1){
    //1,forで回ってきたマスクレイヤーを下のレイヤーと統合してbaseをクリッピングマスクかける(初回のみ統合しない)
    //2,対象を保存する

    if(i != 1){
     var _tmpName = _dObjects.layers[2].name;
     _dObjects.layers[2].visible = true;
     _dObjects.layers[1].merge();
     _dObjects.layers[1].name = _tmpName;
    }

    _dObjects.layers[BASE_NAME].grouped = true;

    if(_saveType == SAVETYPE_PNG24){
     // this.myGlobal.savePng(this.saveDir + "/" , _dObjects.layers[1].name , _saveType);
     this.myGlobal.savePng(this.saveDir + "/" , i , _saveType);
    }else{
     alert("保存形式未対応");
    }

    _dObjects.layers[BASE_NAME].grouped = false;
   }
  }else{
   alert("保存先がみつかりません。なのでキャンセルします");
  }
  
 }
}


//
//実行開始
//
var  
myG = new itaoGlobalObject();
myObj = new puzzuleApp ({gObj : myG})
;

myObj.allLayerSave({saveType : SAVETYPE_PNG24});