次ログ

次ログ

ゆるりと働いているSREの技術ブログのような何か。趣味の話も書く

差分画像を組み合わせた画像をツクールMV規格の画像ファイルにまとめるスクリプト

3連投稿です。 多分もう投稿するネタがないので、しばらくブログの更新が止まると思います。

まえがき

普段が私が絵を描く時に一番つまらない作業は、差分ファイルを作成することです。

なぜなら、差分を作り終わったあとで修正したい箇所が見つかった時、差分を作成する作 業をやり直す必要があるからです。しかも、差分が増えれば増えるほどその作業が増えて 、面倒になります。

そのくせ、やることは非常につまらない作業で、マウスでカチカチするだけというもので す。脳みそがマッハで腐っていきます。

この問題を解決しよう、ということで、自分用にスクリプトを作成しました。

目次

完成したスクリプト

上記のスクリプトを組み合わせて、実際の動作させるスクリプトは下記のようになります。

@echo off

set target_dir=actor019
set outname=%target_dir%_R_%%03d
set facename=%target_dir%_face%%03d
set img="%target_dir%\img"

if exist "%target_dir%\" (
  python layover_image.py "%img%\image_layer.json" %outname% -o "%img%\stand\right"
  python flippicts.py "%img%\stand"
  mkdir "%img%\face"
  python trim4mv.py "%img%\stand\right" %facename% -o "%img%\face"
  copy "%userprofile%\Documents\mydocs\image\rpg_mv\actors\README.html" %img%
  python pyzip.py "%img%" -n "%target_dir%" -x "%target_dir%\src" "%img%\src" "%img%\image_layer.json" "%img%\face\coordinates.csv"
  echo bat処理が終了しました。
) else (
  echo 指定したディレクトリ%target_dir%は存在しません。
)

pause

処理のフロー

今回の作業を自動化するにあたって下記の手順を想定しました。

  1. レイヤー分けした差分画像を組み合わせて、1枚の画像ファイルを生成する。
  2. 画像を任意の順番で組み合わせて、複数の画像を一気に生成する。
  3. 生成された画像から、左右反転した画像を生成する。
  4. 画像をトリミングして、RPGツクール用の8枚パネル上に配置する。
  5. 配布するようにZIPに圧縮する。
  6. Dropboxにアップする

これらの一連の手順をすべて単一のpythonスクリプトでやらせることも可能でしたが、 役割がそれぞれ全く異なるので、別スクリプトに分けておいて、batやbashでコマンドを つなぐようにしました。

また、今回は自分が配布するときのことを考えて、ZIP圧縮することまで自動化するよう にしました。Dropboxにアップする部分は、batchスクリプトの方でやるようにしています 。デスクトップでDropboxに同期するようにしていると、単純にcopyするだけで、Dropbox に配置できるからです。

設定ファイル

{
  "img":{
    "ext":"png",
    "colormodel":"RGBA",
    "base"   : "base",
    "option": [null,["red","highlight"]],
    "pattern" : {
      "necessary":[
          { "eyebrows" : "normal" , "eye" : "normal"   , "mouse" : "normal"  }
        , { "eyebrows" : "normal" , "eye" : "normal"   , "mouse" : "smile"   }
        , { "eyebrows" : "normal" , "eye" : "surprise" , "mouse" : "whisper" }
        , { "eyebrows" : "normal" , "eye" : "normal"   , "mouse" : "spin"    }
        , { "eyebrows" : "normal" , "eye" : "smile"    , "mouse" : "smile"   }
        , { "eyebrows" : "angry"  , "eye" : "normal"   , "mouse" : "shout"   }
        , { "eyebrows" : "sad"    , "eye" : "normal"   , "mouse" : "whisper" }
        , { "eyebrows" : "normal" , "eye" : "smile"    , "mouse" : "normal"  }
      ],
      "others":{
        "mouse":["normal","smile","whisper","spin","shout"],
        "eye":[
          { "name":"close"   ,"eyebrows":["normal"] },
          { "name":"scornful","eyebrows":["normal","angry"] }
        ]
      }
    }
  }
}

組み合わせる画像を配置するための、imgディレクトリのrootに配置します。

設定は単純です。 ファイル名の拡張子なしを指定しているだけです。

necessaryは必須の項目です。 この8個は一番最初に生成される画像になります。 1枚目のパネル画像の並び順を指定したい時に使います。

othersはオプションです。 最初の8枚の生成が終わったあとに処理されます。

正直、これで設定するのはやめようと思いました。

後で見た時に思い出すのに苦労するのと、配布するにはやや複雑な設定ファイルになるの で。

所感

実際に動かしてみたら、かなり作業が楽になりました。

絵のメンテとそれを配布する場所に反映する作業は、非常に手間がかかる割に見返りが少 ないです。

特に、ツクールMV用にトリミングする作業は非常に面倒で不毛な作業です。

拙作のTKoolFacetileMaker2でだいぶ楽になったとはいえ、自動化にまでは至っていませ んでした。

一度行って終了、ならまだ良いのですが、何度も修正することや、今後もやるであろう作 業に無駄が残るのは良くないので、それを自動化できたことの意義は大きいです。

今後

今回のスクリプトPythonで作成しています。 つまり、Windowsの一般ユーザの環境に標準でインストールされていません。

なので、一般向けに配布することを前提にした、スクリプトとして別の言語で書きなおそ うと思います。

現時点での候補としては、下記のものを考えています。

  • Java

    • メリット
      • 一番使い慣れているので、開発も保守も安定している
      • 実行環境も大体にPCにすでにあるため、配布も容易
      • 名前のブランドがあるので、ユーザ的にも安心?
    • デメリット
      • そろそろ新しい言語が勉強したい身としてはあまり触りたくない
      • IDEのサポートがあっても書くのが結構しんどい
  • Kotlin

    • メリット
      • JavaVM言語なので大体の環境で動作させられる。
      • Androidの正式言語の一つにあがっているので、今後の展望に明るい
      • Javaほど書くのがしんどくない。IDEのサポートもある
      • 実行可能ファイルのファイルサイズの増加はやや控えめ (800KBほど)
      • Javaのノウハウが大体使えるので、比較的学習が楽
      • JavaFXも使えるのでGUIアプリも作れる。
    • デメリット
      • 言語仕様がJavaより複雑なので、そのあたりの学習コストがかかる
      • ファイルサイズが増加する
      • 型推論といった仕様の理解がまだ甘いので、バグが見つかった時にサポートできる か怪しい
  • Go

    • メリット
      • 言語仕様がかなりシンプルで、学習コストが低めらしい
      • ロスコンパイル可能で、速度も早い
      • サーバサイド言語としての話題性もあるので、今後に期待できる。 事前に勉強しておけば仕事に繋がりうるかも。
    • デメリット
      • 初めて触るタイプの言語なので、学習コストが未知数
      • GUIアプリの作成は期待できない

途中までKotlinで作成を進めていたのですが、結局Kotlinの勉強するならJavaでいいかな ぁとか最近思うようになってきたので、これを機会にGo言語に触ってみようと思ってまし た。

GUIアプリの作成がやや厳しそうな話を聞いていますが、今回のスクリプトは自動化が目 的なので、CLIでいいかなぁと考えています。それならGoでもできそう。

なので、今回の移植作業はGo言語で行おうと考えています。
一体どんな言語なのか、すでにワクワクしています。

以上です。