ImageMagickを使用して、連写した写真をGIFにする
動機
- 一眼デジカメで連写する
- ホイール回して写真を確認
- なんか動画っぽい
- GIFにしたい
探せば良い記事がありそうだけど、ひとまず自分の備忘録をかねてメモ。
完成イメージ
くっつけた結果はこんな感じ。
作り方
写真の選別
連写した写真の中から、動画にしたい区間をいい感じに選ぶ。連写が続かずに間隔が空いてしまった写真は、思い切ってなくした方がいい感じ。
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
出来上がった結果はブラウザなどで表示確認。
試行錯誤
うちでやったときは、以下のような感じで作った。
- まず画像切り出しも明るさは変えずに繋げる
- 再生しながら切り出し位置と明るさを変えつつ何度か再作成
- 最初と最後の写真を削除したりして、調整
- 3MB 超えてたらもっと縮小するようにして調整
その他メモ
- 上のコマンドを実行すると、GIFの周りに白枠ができたり、ブラウザでの表示位置がおかしかったりする。
convert
に一度に全部のオプションを指定せず、分けて実行したりすると直った。 - 分けて出力する時は、一時ディレクトリを作成して保存するとよい。その際は、保存ファイル名を
%03d.jpg
として連番で保存するとよい。- 何もしないと、0埋めされてない連番で保存されるため、GIFにしたときにおかしくなる。
- 何度もオプションの値を変えながら、何度もGIFを作ることになる。なので、バッチファイルに書いて実行した方が楽。
- バッチに
%
を書く際は%%
と2回続けて書くこと
- バッチに
- TwitterにGIFを投稿する際は、3MB 以内にする必要あり (2015-05-19時点)