色々とわけあって、日曜プログラマをしました。
とはいっても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});