PsAnimation - [[PS_Script]]
目次
フォトショップでアニメするときの便利スクリプト
っぽいものを書いてみる
とりあえずの目標はりまぴんのタイムシートを再生できるようになること
そのいち レイヤをアニメーフレームに
現在のファイルのレイヤーをアニメフレームに展開します。
/* Photoshop レイヤぱらぱら アクティブレイヤのあるレイヤコレクションをパラパラできるようにするよ 簡易アニメチェックにどうぞ。色塗りのパカ探しとか。指パラみたいなもんです。 photoshopのアニメ機能を使うのでCS2以上が必要です */ var exFlag=true; //そもそもドキュメントがなければ終了 if(app.documents.length==0){ exFlag=false; }else{ //起動時にレイヤコレクションの状態を確認 フリップアイテム数が1以下なら終了 if(activeDocument.activeLayer.parent.layers.length<=1){exFlag=false;}; } if(exFlag){ //アニメウインドウ操作関数 現状取得ができないのはヘボいが今のトコはカンベン 後で整理する /* 復帰は不要でトレーラー内部の表示状態だけセットするスクリプトをまず作る フレームは初期化! */ setDly=function(myTime){ // =======================================================アニメーションウィンドウの最初のフレームの遅延を設定 var idsetd = charIDToTypeID( "setd" ); var desc = new ActionDescriptor(); var idnull = charIDToTypeID( "null" ); var ref = new ActionReference(); var idanimationFrameClass = stringIDToTypeID( "animationFrameClass" ); var idOrdn = charIDToTypeID( "Ordn" ); var idTrgt = charIDToTypeID( "Trgt" ); ref.putEnumerated( idanimationFrameClass, idOrdn, idTrgt ); desc.putReference( idnull, ref ); var idT = charIDToTypeID( "T " ); var desc2 = new ActionDescriptor(); var idanimationFrameDelay = stringIDToTypeID( "animationFrameDelay" ); desc2.putDouble( idanimationFrameDelay, myTime ); var idanimationFrameClass = stringIDToTypeID( "animationFrameClass" ); desc.putObject( idT, idanimationFrameClass, desc2 ); executeAction( idsetd, desc, DialogModes.NO ); } dupulicateFrame=function(){ // =======================================================フレーム複製 var idDplc = charIDToTypeID( "Dplc" ); var desc = new ActionDescriptor(); var idnull = charIDToTypeID( "null" ); var ref = new ActionReference(); var idanimationFrameClass = stringIDToTypeID( "animationFrameClass" ); var idOrdn = charIDToTypeID( "Ordn" ); var idTrgt = charIDToTypeID( "Trgt" ); ref.putEnumerated( idanimationFrameClass, idOrdn, idTrgt ); desc.putReference( idnull, ref ); executeAction( idDplc, desc, DialogModes.NO ); } selectFrame=function(idx){ // =======================================================フレーム選択(1/6) var idslct = charIDToTypeID( "slct" ); var desc = new ActionDescriptor(); var idnull = charIDToTypeID( "null" ); var ref = new ActionReference(); var idanimationFrameClass = stringIDToTypeID( "animationFrameClass" ); ref.putIndex( idanimationFrameClass, idx ); desc.putReference( idnull, ref ); var M=executeAction( idslct, desc, DialogModes.NO ); } selectFramesAll=function(){ // =======================================================フレーム全選択 var idanimationSelectAll = stringIDToTypeID( "animationSelectAll" ); var desc = new ActionDescriptor(); executeAction( idanimationSelectAll, desc, DialogModes.NO ); } removeSelection=function(){ // =======================================================選択フレーム削除 var idDlt = charIDToTypeID( "Dlt " ); var desc = new ActionDescriptor(); var idnull = charIDToTypeID( "null" ); var ref = new ActionReference(); var idanimationFrameClass = stringIDToTypeID( "animationFrameClass" ); var idOrdn = charIDToTypeID( "Ordn" ); var idTrgt = charIDToTypeID( "Trgt" ); ref.putEnumerated( idanimationFrameClass, idOrdn, idTrgt ); desc.putReference( idnull, ref ); executeAction( idDlt, desc, DialogModes.NO ); } //アニメーションフレームをアクティブにする(正逆順送り)セレクトとアクティブが別概念のようなので注意だ activateFrame=function(kwd){ //kwd = Nxt ,Prevs,Frst(各4バイト) var idanimationFrameActivate = stringIDToTypeID( "animationFrameActivate" ); var desc = new ActionDescriptor(); var idnull = charIDToTypeID( "null" ); var ref = new ActionReference(); var idanimationFrameClass = stringIDToTypeID( "animationFrameClass" ); var idOrdn = charIDToTypeID( "Ordn" ); var idX = charIDToTypeID( kwd ); ref.putEnumerated( idanimationFrameClass, idOrdn, idX ); desc.putReference( idnull, ref ); executeAction( idanimationFrameActivate, desc, DialogModes.NO ); } //オプションで背景レイヤをパラパラに混ぜるぜるか否かを調整 //最下層レイヤではなく、「背景レイヤ」限定? 考慮中 var myEasyFlip=new Object(); //properties myEasyFlip.targetLayers=activeDocument.activeLayer.parent.layers; myEasyFlip.wait=3*1000/24; myEasyFlip.bgFix=false; myEasyFlip.onLoop=true; myEasyFlip.playStatus="stop"; myEasyFlip.previewLayer=null; myEasyFlip.playList=new Array(); myEasyFlip.backupView=new Array(); myEasyFlip.tableInit=function(){ //メソッド for(idx=0;idx<myEasyFlip.targetLayers.length;idx++){ if((myEasyFlip.bgFix)&&(idx==myEasyFlip.targetLayers.length-1)){ continue; }else{ myEasyFlip.playList.push(idx); } } myEasyFlip.playList.active=myEasyFlip.playList.length-1; // for(idx=0;idx<myEasyFlip.targetLayers.length;idx++){ myEasyFlip.backupView.push(myEasyFlip.targetLayers[idx].visible); } myEasyFlip.backupView.active=activeDocument.activeLayer; } myEasyFlip.tableInit(); myEasyFlip.viewRestore=function(){ for(idx=0;idx<this.backupView.length;idx++){ this.targetLayers[idx].visible=this.backupView[idx]; } activeDocument.activeLayer=myEasyFlip.backupView.active;//これは要らんかも } myEasyFlip.viewInit=function(){ //表示初期化 //アニメーションテーブル初期化 //アニメウィンドウを初期化する>要するに全て消す dupulicateFrame();//一個複製して最低2個のフレームにする(エラー回避) selectFramesAll();//全選択 removeSelection();//削除 //============================================================== for(idx=0;idx<this.backupView.length;idx++){ if(!this.targetLayers[idx].visible){this.targetLayers[idx].visible=true} };//all visible for(idx=0;idx<this.playList.length;idx++){ if(this.targetLayers[this.playList[idx]].visible){this.targetLayers[this.playList[idx]].visible=false} };//playList unvisible this.targetLayers[this.playList[this.playList.length-1]].visible=true;//第一フレーム表示 //第二フレーム以降を表示を切り替えつつアニメフレームに登録 for(var idx=this.playList.length-1;idx>0;idx--){ dupulicateFrame();//作る(フォーカス移動) // alert(this.playList[idx]); this.targetLayers[this.playList[idx]].visible=false; this.targetLayers[this.playList[idx-1]].visible=true; } //表示終了配置初期化 activateFrame ("Frst");//最後に第一フレームにフォーカスしておく // myEasyFlip.playList[0].visible=true;//第一フレーム表示 //setStart this.playStatus="stop"; this.previewLayer=this.targetLayers[this.playList.active]; activeDocument.activeLayer=myEasyFlip.previewLayer; // this.previewLayer.visible=true;//previewLayerはオブジェクト(アクセスターゲット)で } myEasyFlip.flip=function(WD){ var myOffset=(WD=="BWD")?-1:1; if((false)&&(w.namePad.text!=myEasyFlip.previewLayer.name)&&(w.namePad.text!="")){ myEasyFlip.previewLayer.name=w.namePad.text; } this.previewLayer.visible=false; if(this.onLoop){ this.playList.active=(this.playList.active+this.playList.length-myOffset)%this.playList.length;//ループ }else{ this.playList.active=(this.playList.active>0)?this.playList.active-myOffset:0;//stop } this.previewLayer=this.targetLayers[this.playList.active]; this.previewLayer.active=true; activeDocument.activeLayer=this.previewLayer; // w.nameView.text=this.previewLayer.name; // w.namePad.text=""; // alert(w.namePad.textselection); // return "OK!"; } //初期化 myEasyFlip.viewInit(); //============================================================== selectFrame(1);//最後に第一フレームにフォーカスしておく }else{alert("なんだかパタパタするものが無いみたい");}なんだか妙に長いけど、あり物コードを組み合わせたのでカンベンだ。
微妙にコードを整理しました。(動作は同じです)
ファイルのどれかのレイヤを選択した状態でこのスクリプトを実行すると 一連のレイヤを「下から順」に1フレームづつアニメーションウインドウに並べます。
レイヤを並べ替えて再実行すると以前のフレームを全部消して再度並べなおします。
まだセル重ねはサポートしてません。
今までアニメ機能を使っていなかったので、しばらくはこれでイロイロと動作を試して、Photoshopのアニメ機能の探索を行なう予定。
そのに β版お試しです
プロジェクトに名前をつけて、書きためた便利スクリプトをツールパレットから使用できるようにしてみました。
名前は PsAxe (Photoshop Animation Xps Extention) です。 「アックス」とか「斧(おの)」とか呼んで下さると良いと思います。
PsAxe-Betaダウンロード 最終更新 2011.05.24
こちらのリンクからダウンロードできますので、興味のある方はどぞお試し下さい。
ご意見・ご感想などいただけると作者が喜びます。こうすると便利だとか、バグ報告とか歓迎ちゅー
このサイトのBBSとか twitterなどでぼちぼちと店開きしてますので、気が向いたら声かけて下さいね。
動作報告も歓迎(特にCS5)
対応環境
Photoshop CS2 以降 (CS5は動作未確認 …持ってないから) Windows & Mac
あると便利なもの
りまぴんタイムシート適用のためにタイムシートを編集するソフトが必要です。WEB上でも良いですが、ローカルファイルが扱えるので、AIR版がおすすめです。
インストール
CS3以降の方は、ダウンロードしたアーカイブをお好きな場所に解凍して下さい。ツールパレットアプリケーション nasPsAxe をダブルクリックで起動して下さい。 各種機能を使用可能です。
Mac > nasPsAxe.app / Win > nasPsAxe.hta
CS2の方は同様の起動では、一部の機能のみが使用できます。フル機能をご使用になるにはインストール操作が必要です。 ツールパレットの左肩の斧アイコンがインストールボタンです。 クリックするとインストールを開始しますので、指示に従ってインストールを進めてください。
PhotoshopがCS3以上のバージョンの場合は、インストールをしなくてもスクリプトを使用できますが、インストールを行うと動作が軽快になる場合がありますので、このツールを継続的にご使用になる場合はインストールしたほうがよいでしょう。
PhotoshopがCS4以降の場合は、同梱のAdobeConfiguratorPanel?を追加インストールすることで、先にインストールしてあるnasPsAxeのスクリプトをドッキングパネルから利用することができます。
詳しくは同梱のテキストを読むか、BBS twitter などでお問い合わせ下さいな。
イロイロ
Powered by YukiWiki 2.1.2a / Modified by Nekomataya.