はじめに
この記事では、ImageMagick を利用して、カレントディレクトリ以下のサブディレクトリを含むすべての画像ファイルを、指定した形式に一括変換する Shellスクリプト を紹介します。
ImageMagickとは?
ImageMagickは、ビットマップ画像を生成、編集、構成、変換するためのオープンソースのソフトウェアです。コマンドラインから高度な画像処理を実行でき、ウェブ開発や自動化処理で広く使われています。
特に、magick コマンドは、非常に多くの画像形式(PNG, JPEG, WebP, AVIFなど200以上)を相互に変換できるため、本記事のような一括変換処理に最適です。
- 公式ウェブサイト: https://imagemagick.org/
- GitHubリポジトリ: https://github.com/ImageMagick/ImageMagick
困っていたこと
プロジェクトで、多数のディレクトリに分散している PNGファイル を、次世代画像形式である AVIF や WebP などに一括で変換する必要がありました。
ImageMagickには、ファイルを上書きしながら一括変換できる mogrify コマンド があります。しかし、mogrify はカレントディレクトリ直下のファイルには簡単に適用できるものの、サブディレクトリ内のファイルに対して再帰的に処理を行うためには、以下のような手間が必要でした。
- 事前に
findやglobstarを使ってファイルリストを取得する必要がある。 -
mogrifyは通常、元のファイルを上書き(または指定した形式で上書き)するため、異なる拡張子で保存しつつ元のファイルを残す操作が直感的ではない(mogrifyではなくmagickコマンドの方が適している)。
この問題を解決するため、find コマンドと while read、そして magick コマンドを組み合わせて、再帰的なファイル検索と、拡張子を変更して出力する処理をシンプルに実現するスクリプトを作成しました。
Shellスクリプトの解説と実行例
スクリプト(convert_all.shなど)
このスクリプトは、第一引数で変換先の拡張子を、第二引数で変換元の拡張子を指定できるように改良しました。
以下の内容をファイルに保存し、実行権限を付与してください。
#!/bin/bash
# 変換形式(第一引数、$1。デフォルトはavif)
target_ext="${1:-avif}"
# 変換元の形式(第二引数、$2。デフォルトはpng)
source_ext="${2:-png}"
# 引数チェック (変換先が空の場合はエラー。通常はデフォルトが設定される)
if [[ -z "$target_ext" ]]; then
echo "Usage: $0 [target_ext] [source_ext (default: png)]"
exit 1
fi
# ----------------------------------------------
# メインの処理
# ----------------------------------------------
# 'find . -name "*.$source_ext"' :
# - カレントディレクトリ(.)以下から、ファイル名が "*.[指定された拡張子]" に一致するファイルを再帰的に検索する
find . -name "*.$source_ext" | while read file; do
# magick "$file" "${file%.*}.$target_ext"
# - ImageMagickの 'magick' コマンドを実行
# - 入力ファイル: "$file"
# - 出力ファイル: "${file%.*}.$target_ext" (元の拡張子を削除し、指定した $target_ext を付与)
magick "$file" "${file%.*}.$target_ext"
echo "Converted: $file -> ${file%.*}.$target_ext"
done
echo "---"
echo "Conversion complete for all *$source_ext files to $target_ext."
実行例
1. PNGファイルをAVIF形式に変換(デフォルト実行)
第一引数のみ指定(変換元はデフォルトの png が適用されます)。
# 実行
./convert_all.sh avif
# 出力例
# Converted: ./image1.png -> ./image1.avif
# Converted: ./assets/icon.png -> ./assets/icon.avif
# ---
# Conversion complete for all *png files to avif.
2. JPGファイルをWebP形式に変換(変換元/変換先を指定)
第一引数に webp、第二引数に jpg を指定します。
# 実行
./convert_all.sh webp jpg
# 出力例
# Converted: ./photo1.jpg -> ./photo1.webp
# Converted: ./archive/old_pic.jpg -> ./archive/old_pic.webp
# ---
# Conversion complete for all *jpg files to webp.
補足
-
入力形式の変更: 変換元の指定は、スクリプト内の
source_ext変数(第二引数)で制御されます。 -
ファイル名置換の仕組み:
${file%.*}.$target_extは、Shellのパラメータ展開機能です。変数$fileから末尾の最短一致パターン.*(元の拡張子) を取り除き、その後に新しい拡張子.$target_extを付与します。
このスクリプトを使えば、ディレクトリ構成を保ったまま、簡単に画像形式の一括変換が可能です。
おわりに
このシェルスクリプトを使用することで、煩雑だったサブディレクトリ内の画像ファイルに対する次世代フォーマットへの一括変換をスムーズに行えるようになりました。
WebPやAVIFなどの次世代画像フォーマットの利用は、画像ファイルサイズを大幅に削減し、ページの読み込み速度を向上させます。これは、GoogleのCore Web Vitals(コアウェブバイタル)の評価を向上させ、SEOにも良い影響を与える重要な対応です。
ぜひ本スクリプトを活用して、ウェブサイトのパフォーマンス改善にお役立てください!
PR
株式会社HRBrainではHRBrainで一緒に働いてくれる仲間を募集しています。
エントリーお待ちしています!