立ち絵の最適化

忙しくてご無沙汰しておりました。
先の案件で作ったツールをつまみに、それをネタにちょこっと足跡を残しておこうと思います。


作ったツール「AlphaTrimer」は不要な透明部分を削除、トリミングするツールです。
画像素材でトリミングが必要なケースなんて極々希なんですが、ただ1つだけ非常に重宝するケースがあります。
「立ち絵画像」です。
最近のソフトは立ち絵が膨大になってきており、それに伴い読み込み速度が結構シビアに要求されるようになってきました。(画像キャッシュのヒット率の低下等で)
また、解像度を上げる場合は不要な部分が占めるメモリ使用量も結構馬鹿になりません。
そこで、自動的・機械的に行えるツールが必要となったわけです。


トリミングツールの多くは不要な部分を全て削除してしまいます。
この場合、せっかく位置合わせように仕込んだ透明部分が無くなってしまい、表示座標にズレが生じてしまいます。
かといって、数千にもなる立ち絵のトリミング座標リストを用意するのもいささか面倒です。
もうちょっと作業的に楽したいですよね。


ちょっと話を置いておいて、立ち絵の座標合わせについて。
立ち絵の場合、そのまま原点座標が左上に来るように表示させると、いちいち座標合わせ情報が必要なので管理が非常に面倒です。
そこで、中央揃え(センタリング)、下揃えで表示させます。
そうすると、座標合わせようのリスト情報は不要になり、画像(サイズ)だけで調節・管理ができるので非常にラクチンです。

|   ●   | |   ● / |
|  -■-  | |  /■/  |
|   ||   | |   |    |

このようにキャラの中心が画像の中央に来るようにして、左右に透明領域を設けて調整します。
中央揃え(センタリング)するわけですから、左右に等しい透明領域がどれだけあろうとも、表示位置は変わりません。
また下揃えなので、キャラの頭身関係もばっちりそのまま表示できます。


さて話を戻して最適化です。
ここまで話せば大体見えてきたかと思います。
中央揃えをするという前提条件があれば、中央揃えをする限り同じ見え方になるように左右の不要な部分をトリミングすればいいわけです。
つまり、左右同じPixel分だけトリミングすれば、中央位置は維持され、表示結果は同じになります。

| ● | |  ● /|
|-■-| | /■/ |
| || | |  |   |

というふうに最適化することが出来ます。
右のように、一方方向に長い画像の場合はあまり最適化が利きませんが、画像単位に最適化が出来るので、全体的にみれば許容範囲内でしょう。


次に縦方向の最適化です。
下揃え表示することを前提にすると、頭より上が必要有りません。
上部分のみ切り取る処理を行えばOKです。

| ● | |    |
|-■-| |w●w|
| || | |    |

下部分も最適化出来そうに思えますが、右のように空中を飛ぶようなキャラがいる場合は得策ではないでしょう。


以上が最適化の流れです。
なかなかこういったトリミングが行えるツールがなかったので作った次第です。
それさえ出来れば、中央揃え、下揃えの簡単な実装があれば出来ちゃうのでお手軽ですし、処理内容もシンプルなので理想的かと思います。


余談。
これを導入したら「最適化前の左上の座標がわからない」って言われました。
なにやら表情記号の位置を左上からの差分座標で管理していたようで、左上の座標が欲しかったようです。
実は簡単に求められて、最適化前の全キャラの画像サイズを統一します。(キャラ単位でも良いです)
4000x4000という馬鹿でかいのでも構わないでしょう。
それに上の同じように最適化をかけて画像サイズを小さくします。
最適化され小さくなったとしても、必要なのが最適化前の座標ですから

left= x-4000/2
top = y-4000

と、サイズを統一していれば簡単な式で求められます。