ImageMagickを使用して、連写した写真をGIFにする

動機

  1. 一眼デジカメで連写する
  2. ホイール回して写真を確認
  3. なんか動画っぽい
  4. GIFにしたい

探せば良い記事がありそうだけど、ひとまず自分の備忘録をかねてメモ。

完成イメージ

くっつけた結果はこんな感じ。

f:id:hisadg:20150519223211g:plain

作り方

写真の選別

連写した写真の中から、動画にしたい区間をいい感じに選ぶ。連写が続かずに間隔が空いてしまった写真は、思い切ってなくした方がいい感じ。

ImageMagick

一枚ずつ編集するのは大変なので、ImageMagickを使う。

ImageMagick

GIF作成以外にも色々出来る。今回は回転、縮小、明るさ調整、切り出しの機能も使う。

ImageMagick使い方

画像の回転

編集しやすいように、まずはEXIF情報を元に画像を回転しておく。縦持ちで撮った写真とかは、これをやっとかないと後で困る。回転はImageMagick-auto-orientオプションを使う。これだけでEXIF情報を元に画像をうまいこと回転してくれるので、便利。

画像の切り出し

映り込みがあったり、被写体が小さかったりするので、画像から特定位置を切り出す。ImageMagick-cropオプションを使う。指定方法は、横幅x縦幅+始点X+始点Y-crop 4000x2100+1472+700みたいな感じで指定する。切り出し位置はペイントとか写真編集ソフトで座標をチェック。

縮小

撮影したJPEGをそのままGIFにすると、画像的にも容量的にも結構なサイズになる。320x240など、それらしいサイズに縮小してやる。ImageMagick-geometryオプションを使う。割合で縮小すると、縦横比とか気にしなくていいので楽。電卓でそれらしい割合を計算。

明るさ変更

明るい写真の方がいい感じな場合は明るさ調整。-modulateオプションで、明るさを調整。100が基準の明るさらしいので、倍に明るくしたければ200とかを指定。

GIFにする

最後にGIF変換。ImageMagickは連番ファイルを繋げてGIFにするので、連番ファイルになってることが大事。GIF変換では-delay-loopオプションを使う。-delayには1枚の画像の表示時間を1/100秒単位で、-loopではループ画像にするかどうかを指定する。-loop 0でループになる。

-delayの値はカメラの連写速度から計算しても良いし、あえて速めにするのも面白い。

実行コマンド

以上を元に、JPEG画像を集めたディレクトリ内で以下のコマンドを実行。ImageMagickのオプションは一括で指定しても良いようなので、一回で指定してしまう。

convert .\*.jpg -auto-orient -crop 4000x2100+1472+700 -geometry 10% -modulate 160 -delay 9 -loop 0 movie.gif

画像切り出しも明るさ調整も不要なら、以下でOK。

convert .\*.jpg -auto-orient -geometry 10% -delay 9 -loop 0 movie.gif

出来上がった結果はブラウザなどで表示確認。

試行錯誤

うちでやったときは、以下のような感じで作った。

  1. まず画像切り出しも明るさは変えずに繋げる
  2. 再生しながら切り出し位置と明るさを変えつつ何度か再作成
  3. 最初と最後の写真を削除したりして、調整
  4. 3MB 超えてたらもっと縮小するようにして調整

その他メモ

  • 上のコマンドを実行すると、GIFの周りに白枠ができたり、ブラウザでの表示位置がおかしかったりする。convertに一度に全部のオプションを指定せず、分けて実行したりすると直った。
  • 分けて出力する時は、一時ディレクトリを作成して保存するとよい。その際は、保存ファイル名を %03d.jpg として連番で保存するとよい。
    • 何もしないと、0埋めされてない連番で保存されるため、GIFにしたときにおかしくなる。
  • 何度もオプションの値を変えながら、何度もGIFを作ることになる。なので、バッチファイルに書いて実行した方が楽。
    • バッチに%を書く際は%%と2回続けて書くこと
  • TwitterGIFを投稿する際は、3MB 以内にする必要あり (2015-05-19時点)