シェルとfehコマンドを組み合わせて多量の画像から特定の写真を集めたサムネイル画像を作る方法


これは空のタイムラプス動画を作る時に撮影した画像から30分毎に撮影したものだけを抜き出して作ったものです。これをLinuxのコマンド操作で作ってみることにします。
(環境 : Ubuntu 16.04.3LTS)

パターン指定で特定の画像だけを表示させられる画像ビューアでも同じようなサムネイル画像は作れますが、今回は以前紹介したfehというコマンドを使います。
(以前の記事 : fehコマンドのモンタージュモード(サムネイル作成) )

サムネイル画像の作り方は以前書いた通りですが、今回は30分毎の画像だけを抜き出すという操作と組み合わせます。
まず対象とするファイルは以下のようなものになります。
webcam-20170824-124815.jpg webcam-20170824-124830.jpg webcam-20170824-124845.jpg
webcam-20170824-124900.jpg webcam-20170824-124915.jpg webcam-20170824-124930.jpg
webcam-20170824-124945.jpg webcam-20170824-125000.jpg webcam-20170824-125015.jpg
webcam-20170824-125030.jpg webcam-20170824-125045.jpg webcam-20170824-125100.jpg
webcam-20170824-125115.jpg

ここでファイル名の命名規則は「webcam-撮影年月日-撮影時間.jpg」となっています。
30分毎の写真を探すとき、例えば12時では12時00分と12時30分の写真を探すとします。これをfindコマンドで書くと、
find ./ -name 'webcam-*-12[03]000.jpg'

となります。今回は12時以外の時間のものも対象とするので、それを踏まえて書き直すと
find ./ -name 'webcam-*-??[03]000.jpg'

となります。これで対象となる画像のファイル名は取得出来るのですが、出力されるファイル名の順番がバラバラになっています。サムネイル画像にするためには時間順で並べる必要があるので、ここでsortコマンドにパイプで渡します。
find ./ -name 'webcam-*-??[03]000.jpg' | sort

(ファイル名によってはsortコマンドのオプションを指定する必要があるかも知れません)

さてこれで時間順に並んだファイル名のリストが出来るので、これをfehコマンドに渡します。fehコマンドはパイプで標準出力を渡す場合、「-f -」というオプションを付ける必要があります(詳しくはmanなどドキュメント参照)。
以上を踏まえて最終的なコマンドを書くと
find ./ -name 'webcam-*-??[03]000.jpg' | sort | feh -f - -m -y 150 -E 100 -W 750

となります(fehコマンドのオプションの意味は以前の記事 を参照)。
そうすると一番始めに貼ったようなサムネイル画像が得られます。この書き方だと画像はウィンドウに表示されますが、オプションを指定すれば直接ファイルへ出力もできます。
コマンドラインで書くと多少長くなりますが、コマンド一行で出来るのでお手軽です。


さて今回の記事に関しては、ファイル名からパターンを作成して特定の写真を抜き出せましたが、これはこういったファイル名だったから使えるに過ぎません。ファイル名に撮影時間が付かないというケースも多いので、個々の状況に応じてコマンドを変える必要があります。自分はやったことはないですが、jpegファイルのEXIFに書かれた撮影日時から抜き出すといったことも出来るかも知れません。もしパターン化が難しそうだったら目視でファイルを抜き出して画像ビューアでサムネイル化というのが一番楽というケースもあると思います。
コマンド操作で作るというのは万能というわけではないため、目的を達成するためには方法にこだわり過ぎずに最も楽を出来そうな方法を使うのがいいかと思います。それでもコマンドラインもある程度覚えておくといろいろ応用が効くので、覚えておいて損はないでしょう。


コメント