カレンダー

06 | 2017/07 | 08
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -

最近のコメント

最近の記事

カテゴリー

リンク

このブログをリンクに追加する

月別アーカイブ

アクセスカウンター

PSDtoPNG
次の作業に移る。

RPGツクールではpsdファイルは使用できない!
だから、使えるようにpngファイルに変換してやらなければいけない!

ところで、作成したPSDにはbodyレイヤーとbody_bレイヤーがある。
それぞれ、こんな画像である。

bodyレイヤー
苦笑_fuku

body_bレイヤー
苦笑_fuku_b

なんで、二種類あるかというと、こういうことをしたいからだ。
sample2.png
あくまでもサンプルでげすよ。

そういうわけで、psdから二枚のpngを出力する必要がある。
ファイル名のフォーマットは[psdのファイル名]+[_]+[レイヤー名].pngにしたい。
しかし、アクションではちょっと具合が悪い。アクションでは別名保存だと出力ファイル名が固定になる。
上のようなフォーマットを複数のファイルでということはできんのですよ。


だから、手動でやるしかない。
レイヤーをすべて非表示にして・・・・
目標のレイヤーを表示状態にしてファイル名を入力して別名保存・・・・
レイヤーをすべて非表示して・・・・
目標のレイヤーを表示状態にしてファイル名を入力して別名保存・・・・
ファイルを開きなおして・・・・
レイヤーを・・・・・


無理!


600以上あるファイルを手動でやるなんて絶対無理!

ここはひとつ、スクリプトを書いてみよう。
--------------------------------------
function run() {
  var loadDirectoryPath = 'C:\\testData\\cg\\0_bb\\テスト';
  var loadDocName = '名称未設定 1';
  var targetLayers=new Array('body','body_b');

  var loadFile = new File(loadDirectoryPath + '\\' + loadDocName + '.psd');
  var doc = app.open(loadFile);

  allLayerUnview(doc);

  for(i=0;i    var lay = getTargetLayer(doc,targetLayers[i]);
    if(lay !=null){
      lay.visible=true;
      var savePathPng = loadDirectoryPath + '\\' + loadDocName + '_' + lay.name;
      var savefile = new File(savePathPng);
      var opt = getSaveOption();
      doc.saveAs(savefile, opt,true);
      lay.visible=false;
      }
    }
  doc.close(SaveOptions.DONOTSAVECHANGES);
 return ;
}
function getTargetLayer(doc,targetLayer){
  for(var i = 0; i < doc.layers.length; i++){
      if(doc.layers[i].name==targetLayer){
        return doc.layers[i];
        }
    }
  return null;
  }
function allLayerUnview(doc){
  for(var i = 0; i < doc.layers.length; i++){
      doc.layers[i].visible=false;
  }
}
function getSaveOption() {
  var opt = new PNGSaveOptions();
  opt.interlacsd=false;
  return opt;
  }
run();
--------------------------------------
うむ、いい感じた。
これで名称未設定 1.psdから名称未設定 1_body.png、名称未設定 1_body_b.pngができる。

こいつを指定したフォルダ下のpsdファイル全てに実行できるようにしたい。
javascriptでもファイル操作できるが、文字のパースが面倒なので、c#でPhotoShopを呼び出すように書いてみる

--------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace pngCreater
{
 class Program
 {
  private const string ROOTPATH = @"C:\\testData\\cg";

  public const string CODE = @"
function run() {{
  var loadDirectoryPath = '{0}';
  var loadDocName = '{1}';
  var targetLayers=new Array('body','body_b');

  var loadFile = new File(loadDirectoryPath + '\\' + loadDocName + '.psd');
  var doc = app.open(loadFile);

  allLayerUnview(doc);

  for(i=0;i    var lay = getTargetLayer(doc,targetLayers[i]);
    if(lay !=null){{
      lay.visible=true;
      var savePathPng = loadDirectoryPath + '\\' + loadDocName + '_' + lay.name;
      var savefile = new File(savePathPng);
      var opt = getSaveOption();
      doc.saveAs(savefile, opt,true);
      lay.visible=false;
      }}
    }}
  doc.close(SaveOptions.DONOTSAVECHANGES);
 return ;
}}
function getTargetLayer(doc,targetLayer){{
  for(var i = 0; i < doc.layers.length; i++){{
      if(doc.layers[i].name==targetLayer){{
        return doc.layers[i];
        }}
    }}
  return null;
  }}
function allLayerUnview(doc){{
  for(var i = 0; i < doc.layers.length; i++){{
      doc.layers[i].visible=false;
  }}
}}
function getSaveOption() {{
  var opt = new PNGSaveOptions();
  opt.interlacsd=false;
  return opt;
  }}
run();
";
  static void Main(string[] args)
  {
   foreach (DirectoryInfo di in new DirectoryInfo(ROOTPATH).GetDirectories()) {
    searchFile(di);
   }
  }
  private static void searchFile(DirectoryInfo di)
  {
   foreach (FileInfo fi in di.GetFiles()) {
    if (fi.Extension.ToLower() == ".psd") {
     createPng(fi);
    }
   }
   foreach (DirectoryInfo di2 in di.GetDirectories()) {
    searchFile(di2);
   }
  }

  private static void createPng(FileInfo fi)
  {
   string code = string.Format(CODE
    , fi.Directory.FullName.Replace(@"\", @"\\")
    , fi.Name.Substring(0, fi.Name.Length - fi.Extension.Length).Replace(@"\", @"\\"));

   object[] args = new object[] { };

   Type tps = Type.GetTypeFromProgID("Photoshop.Application");
   var tpsObject = Activator.CreateInstance(tps);
   object retObj = tpsObject.GetType().InvokeMember(
    "DoJavaScript",
    System.Reflection.BindingFlags.InvokeMethod,
    null,
    tpsObject,
    new object[]
      {
       code,
       args,
       1
      });
  }
 }
}
-------------------------------------------------------
突っ込みどころ満載だな。しかし、なんだかんだ言って必要なpngファイルができたからよし!

腰から上のファイル1046ファイル
顔アインコン524ファイル

よし! 計算が合わない辺りはあれだ。その・・・・・

そんなことはどうでもいい!

なぜなら次は増えたキャラクター分だけ戦闘用のイラストも描かなければいけないのだ。細かいことにこだわっている場合ではない!

といいつつ、まとまった時間ができたから、年末年始はストーリーの書き直しをするか。
色々と手直ししたい部分もあるからな。
スポンサーサイト
[2013/12/28 15:25] | ペトリケーション2 | コメント(0)
<<あけおめ | ホーム | リサイズアンドトリミング>>
コメント
コメントの投稿












管理者にだけ表示を許可する

牙行の色々やること


Maiki's House運営者牙行のブログです。

プロフィール

牙行

Author:牙行
ASFR & WAM を重点的に扱っています。いろいろなことに興味を持つゆえにフラフラしているダメ人間。
定型句ではありますが書いときます。
このブログにあるコンテンツの無断転載転用だめですよぉ。

pixiv

Twitter...

DLSite.com

ブログ内検索

ブロとも申請フォーム

この人とブロともになる