(O+P)ut

頭の整理のために、Slerで働く若手インフラエンジニアが、【 (O+P)ut = OutPut 】していく場です。

【Java】複数画像を元にGIF画像生成

f:id:mtiit:20170909134236j:plain
Twitterの話題ワードがどのように遷移しているかをGIFで可視化するという記事ですが、
【R言語】Twitterより取得した話題ワードの遷移可視化 - (O+P)ut
上の記事は文字列から一意の座標を生成するところにフォーカスをあてていました。

今回は、Javaを用いて大量のJPEG画像からGIF画像を生成する手法について紹介します。
というのも、実は海外の方*1が書いたソースコードがネットに転がっていました。
http://elliot.kroo.net/software/java/GifSequenceWriter/GifSequenceWriter.java
特別なライブラリも必要なく、コメントもしっかりと記述されているのでとても参考になります。

ソースコードを見てみると、

ImageOutputStream output = 
new FileImageOutputStream(new File(args[args.length - 1]));

となっています。つまり、引数argsの末端が出力GIFのパス、それ以外は入力画像のパスという仕組みです。
今回はディレクトリ直下の画像のパスを取得し、pathlistという新たな配列を用意してargs代わりに使いました。*2

String path = "hoge"; //画像が置いてあるディレクトリ
File dir = new File(path);
File[] files = dir.listFiles();
String[] pathlist = new String[files.length];
for (int i = 0; i < files.length; i++) {
 pathlist[i] = files[i].toString();
}

あとは、args部分をpathlistに置き換えて実行すれば問題なく稼働します。

timeBetweenFramesMS

という変数で、フレームの切り替わりの時間を管理しているので、そこは適宜変更してみてください。ループするか否か等も変更可能です。

私がGIFを作る時は、"サブリーン"というウェブサイトの"パラパラマンガ"機能をよく使いますが、
プログラムとしてGIFが生成できるというのも、自動化等を考えた際には有効だと思います。
ご参考ください。

*1:Elliot Kroo氏作

*2:dir.listは、取得順序が不明なようです。本来は、きちんと名前順でソート等も必要ですが今回は目視して名前順になっていたのでソートしてないです。