サムネイルを自動生成するワンライナー

画像の連番ファイル 001.png、002.png、003.png ... から、一枚のサムネイル画像をつくるワンライナーです。画像の一括変換のような単純な繰り返し作業は、コマンドラインでone linerを使う方が効率が良いです。以下手順をまとめます。

なおLinuxだけでなく、Windowsの場合でも cygwin を使えば同じ事が出来ます。

まず単純な方法。サムネイル画像をつくるだけなら、ImageMagick の montage というコマンドを使うだけです。

$ montage *.png /tmp/output.png

これでカレントディレクトリのpng画像をすべてを並べて、thumbnailを自動生成してくれます。出力画像のファイル名は /tmp/output.png になります。

次に、たとえば 001.png から 059.png までの画像を、横10枚、縦に6列、敷き詰めた画像をつくる場合。ここからは、シェルの力を借ります。 bash だと以下のコマンドになります。

$ L="" ; for x in `seq -f %02g 1 59`; do LST="$LST $x.png"; done ; montage -tile 10x6 $L /tmp/output.png

bashのfor文、seqコマンドの連携です。

seqコマンドは、連番を生成するプログラム。実体は /usr/bin/seq 。使い方は

$ seq 1 10
$ seq -f %02g 1 10
$ seq -f %02g.png 1 10

のような感じです。

さらに 001.pngから059.pngの画像を敷き詰めるんだけど、一部画像に欠けがありその部分は空白にしたサムネイル画像をつくりたい、そのときは以下のようにします。

$ L="" ; for x in `seq -f %02g 1 59`; do f=$x.png ; if [ -e $f ]; then LST="$LST $f"; else LST="$LST -size 320x240 xc:none"; fi; done ; montage -tile 10x6 $L /tmp/output.png

馴れていないと読みにくいかも知れません。整形して書き下すと以下のようになります。

L="" 
for x in `seq -f %002g 1 59`; do 
  f=$x.png
  if [ -e $f ]; then 
    LST="$LST $f"
  else 
    LST="$LST -size 320x240 xc:none"
  fi
done
montage -tile 10x6 $L /tmp/output.png

なお"-size 320x240 xc:none" の部分は、imagemagick系のコマンドでよく使うオプションです。画像ファイル名の代わりに"-size 320x240 xc:none" というオプションを指定すると、320x240つまりQVGAサイズのダミー画像を使うようになります。非常に便利です。