ImageMagick で写真フォルダのサムネイルを作ったりしてみる

Windows エクスプローラなんかで、写真や動画があるフォルダをサムネイル表示した状態の一枚絵が欲しい時があった。「このフォルダには大体どんな写真が入っているのか」を表現する、複数のサムネイルが写った1枚の画像が欲しいな、というワケである。

バッチ処理で大量のフォルダのサムネイルを作りたかったので、久々に ImageMagick を利用して作ってみることにした。

目次

ImageMagick をダウンロード・インストールする

ImageMagick 本体は ↑ から Windows 版 ImageMagick-7.1.1-12-Q16-HDRI-x64-dll.exe をダウンロードしてインストールした。Windows GitBash で magick コマンドが実行できるようになった。

以前の ImageMagick のバージョンでは convert コマンドなんかが存在したが、現在の v7 系は magick convert というような感じで、magick コマンドのサブコマンドとして色々と実行するようである。

画像ファイルをリサイズして縮小版のサムネイルを作成する

指定の画像ファイル SRC.jpg を、100x100px のサイズにリサイズして DEST.jpg を生成するには、次のようなコマンドになる。

$ magick SRC.jpg -resize 100x100 -gravity center -extent 100x100 DEST.jpg

-resize 100x100 のみだと、長辺が 100px でアスペクト比を守った画像となる。必ず 100x100px にしたいのであれば、-extent 100x100 を追加することで、アスペクト比を超えた部分に空白を入れて (つまり画像の上下や左右に白い帯を入れて) 画像をリサイズできる。画像の配置のために -gravity center を指定している。

画像ファイルは JPG、PNG、GIF の他、iPhone の写真などで用いられる HEIC 形式も圧縮・変換ができる。

動画ファイルからサムネイルを作成する

動画ファイルに関しては ImageMagick ではなく FFmpeg を使ってサムネイル作成ができる。FFmpeg は ImageMagick のインストール時にも同梱されているため、そちらで用意できるだろう。

$ ffmpeg -i SRC.mp4 -f image2 -ss 00:00:01 -vframes 1 -s 100x100 DEST.jpg

コチラが SRC.mp4 動画ファイルの1秒目のコマを抜き出して、100x100px の DEST.jpg ファイルを生成するコマンド。コチラの場合は、アスペクト比を無視して短辺を引き伸ばす形で 100x100px にリサイズされることに留意。

また、長さが1秒未満の動画ファイルでこのコマンドを叩くと DEST.jpg が生成されないため、その場合は -ss 00:00:01 部分で指定している秒数を -ss 00:00:00 (0秒目) などに調整してやると良い。

サムネイル画像をタイル状に並べる。

こうして用意した 100x100px のサムネイル画像達を、横3列、縦5行の最大15枚でタイル状に並べたいと思う。その場合は magick montage コマンドでタイル状の羅列が可能だ。

$ magick montage Thumb-1.jpg Thumb-2.jpg Thumb-3.jpg Thumb-4.jpg -tile 3x0 -geometry +0+0 THUMBNAILS.jpg

Thumb-1.jpg Thumb-2.jpg …とサムネイル画像を羅列している。-tile 3x0 で、横3列、縦は動的に行数を設けるようにしている。-geometry +0+0 は、画像間の隙間の指定だ。CSS でいう column-gaprow-gap の指定で、今回は隙間を一切作らないようにしている。

イメージ的には、iPhone の「写真」アプリで見られるサムネイルのような感じで、複数の画像がタイル状に並んだ1枚の画像 THUMBNAILS.jpg が出来上がる、というワケ。サムネイル画像は 100x100px で生成しているので、3列で幅 300px の画像となっている。

タイトルとなる文字入りの画像を生成する

タイル状に作った画像と一緒に、タイトル文字列を入れたい。「○月○日 誕生日会」的な感じのテキストを入れたいとする。

ImageMagick では無のところからキャンパスを作り、塗りつぶしやテキスト挿入などをコマンドで設定して画像を作り出せる。今回は以下のようなコマンドを組み立ててみた。

$ magick convert \
  -background '#cccccc' \
  -font '/c/Windows/Fonts/meiryo-ke-6.30-rev5-gothic.ttf' \
  -pointsize 30 \
  -gravity center \
  -extent 300x50 \
  label:'○月○日 誕生日会' \
  TITLE.jpg

-background で塗りつぶし背景色を指定。-font オプションで使用するフォントを指定する。ココでは「メイリオ改」を指定しているが、何らかの日本語フォントを指定すればよいだろう。

-pointsize がフォントサイズ。-gravity で配置する位置 (中央揃え)、-extent でキャンパスサイズを指定している。そして最後に label:'文字列' というオプションでテキストを設定できる。

コレで、無からタイトルを示した TITLE.jpg を生成できた。

テキスト画像とタイル画像を結合する

さて、そんなワケで、300x50px のテキスト画像と、300x500px のタイル画像がそれぞれ用意できた。コレを縦 (上下) に結合した最終版の画像を1枚生成したいと思う。

$ magick convert -append TITLE.jpg THUMBNAILS.jpg FINISHED.jpg

こんな感じ。convert -append を使うと、後続の画像を縦に並べてくれる。コレが convert +append (- ではなく +) だと、画像を横に並べてくれる。前述の magick montage -tile よりも簡単な連結ならコレで良いだろう。

以上

ImageMagick の実行コマンドはこんな感じ。

実際は、日付別のフォルダに格納された写真や動画に対して、「サムネイル生成」→「タイル状に連結」→「フォルダ名でタイトル画像を生成」→「タイルとタイトルを結合し書き出し」という一連の処理を行うようにバッチスクリプトを書いた。magick コマンドさえ叩ければ良いので、バッチスクリプト部分は Bash (GitBash) だろうが Node.js や Python だろうが何だって良い。

実行速度などにこだわり始めると後継ツールが出てきてはいるものの、旧バージョンからの知見がネット上に豊富に存在する歴史の長いツールなので、ImageMagick を覚えておくととりあえず何か画像処理するには便利だ。