サムネイルが並んだリスト (Contact Sheet) を作成する

rein
質問: 大量の画像をまとめて眺めたい
大量の画像があるのですが、どんな画像があるかまとめて確認したいです。サムネイルとファイル名が表示されたタイルがたくさん並んでいる画像を作成して 一覧で見れるようにしたいのですが、良い方法はありますか?

ソリューション

サムネイルとキャプションが並んだリスト (Contact Sheet) を作成することで、多くの画像ファイルを素早く一覧できます。
Contact Sheetを作成するアプリケーションはいろいろありますが、今回は ImageMagickのmontageコマンドを利用する方法を紹介します。

事前準備

画像の準備

元の画像を用意します。

ImageMagickのインストール

ImageMagickをインストールします。インストール手順はこちらの記事を参照してください。

手順

コマンド

コマンドの書式は以下です。
(ImageMagickのインストールディレクトリ)\montage.exe -label "[ラベルの書式]" "[入力ファイル]" -tile [横数]x[縦数] -geometry [サムネイルの横幅]x[サムネイルの高さ]+[xマージン]+[yマージン] [出力ファイル名]
バッチファイルで複数行に分ける場合は以下になります。
(ImageMagickのインストールディレクトリ)\montage.exe ^
-label "[ラベルの書式]" ^
"[入力ファイル]" ^
-tile [横数]x[縦数] ^
-geometry [サムネイルの横幅]x[サムネイルの高さ]+[xマージン]+[yマージン] ^
[出力ファイル名]

記述例

カレントディレクトリにあるpngファイルのサムネイルのリスト(Contact Sheet)をcontact-sheet.pngファイルとして作成する例です。
(ImageMagickのインストールディレクトリ)\montage.exe -label "%f" "*.png" -tile 4x5 -geometry 240x240+16+16 contact-sheet.png

実行例

今回はこちらの画像を準備しました。たくさん画像があります。


コマンドプロンプトを開き、次のコマンドを実行します。
c:\tools\ImageMagick\ImageMagick-7.1.1-47-portable-Q16-x64\ImageMagick-7.1.1-47-portable-Q16-x64\montage.exe -label "%f" "*.png" -tile 4x5 -geometry 240x240+16+16 contact-sheet.png


コマンドが実行され、終了するとコマンド入力待ち状態に戻ります。


ディレクトリを確認すると、contact-sheet-0.png contact-sheet-1.png ... contact-sheet-6.png のファイルが作成されています。


contact-sheet-nn.png のファイルを開きます。サムネイル画像とファイル名が並んだ状態で表示されています。


サムネイルとキャプションが並んだリスト (Contact Sheet) を作成できました。

もっと1つの画像(ページ)内にたくさん画像を表示させたい場合は列数と行数を増やします。
下図は以下のコマンドを実行して作成した結果です。
c:\tools\ImageMagick\ImageMagick-7.1.1-47-portable-Q16-x64\ImageMagick-7.1.1-47-portable-Q16-x64\montage.exe -label "%f" "*.png" -tile 24x8 -geometry 240x240+16+16 contact-sheet.png

複数のサブフォルダに対してサムネイル一覧を作成する

指定したディレクトリのサブフォルダにある画像のサムネイル一覧を作成する場合の例です。
サブディレクトリがたくさんある場合には、以下のPowerShellスクリプトを実行すると1回で作成できます。
指定したディレクトリにフォルダ名の画像ファイルでサムネイルリストが作成されます。1ページに収まらない場合は-0 -1 がファイル名の後ろにつきます。
CreateContactSheet.ps1
# ImageMagick の montage.exe へのパス
$montage = '(ImageMagickのインストールフォルダ)\montage.exe'

# 画像元ルート(サブフォルダを再帰的に処理)
$parent = '(画像のあるディレクトリの一つ上のディレクトリパス)'

# 出力先ルート。各サブフォルダ名をここに付加してファイルを出力
$outputRoot = '(サムネイル画像の出力先パス)'

# 出力先フォルダを作成(既存でもエラーにならない)
New-Item -ItemType Directory -Path $outputRoot -Force | Out-Null

# サブフォルダごとにループ
Get-ChildItem $parent -Directory | ForEach-Object {
    $inDir  = $_.FullName           # フルパス
    $name   = $_.Name               # フォルダ名のみ(例: folderA)
    $outFile = Join-Path $outputRoot "$name.png"  # 出力ファイル名

    # montage 実行。& で外部コマンドを呼び出し
    & $montage -label "%f" "$inDir\*.png" -tile 16x8 -geometry 480x480+32+32 $outFile

    Write-Host "生成完了: $outPdf"
}
著者
iPentecの企画・分析担当。口が悪いのでなるべく寡黙でありたいと思っている。が、ついついしゃべってしまい、毎回墓穴を掘っている。
作成日: 2025-04-12
Copyright © iPentec all rights reserverd.