Makefileとlibavifを使用し、コマンドラインで画像ファイルをAVIF形式に自動変換する。

AVIF は少しずつ浸透してきていますが、スマートフォンなどのデバイスで撮影した画像は heic や jpg が主流です。これまで利用してきた画像ファイルも当然使いたいので、avif 形式への変換作業は避けられないでしょう。少しでも作業負荷を軽減するため、Makefile と libavif を利用し、画像変換作業を半自動化しました。

avif 変換ツール

下記のツールを利用しました。

libavif

CLI で利用可能かつ Homebrew で手軽にインストールできます。

使い方は非常にシンプルで、下記のコマンドで変換できます。

avifenc ${input} ${output}

簡単なのであえて make コマンドを用意する必要はないかもしれません。しかし複数の画像をまとめて変換したいケースが存在するため make コマンドを用意しました。

make コマンドの実装

Go のアプリケーション開発では初期化やコンパイルの作業を効率化するため、makefile を用いた自動化を行うことが多いです。Node.js で使われる package.json に少し似ています。

下記は私が用意した makefile です。複雑なコマンドは実装していませんが、hugo のコマンドを忘れてしまうため、この程度の自動化でも非常に重宝します。

init:
	docker compose up -d

run:
	docker compose exec hugo_app hugo server -D --bind="0.0.0.0"

new:
	docker compose exec hugo_app hugo new posts/`date +"%Y-%m-%d"`_.md

avif の変換コマンドも makefile に追加します。今回は下記の様に、指定のディレクトリに置いたすべての画像ファイルを変換する形で実装しました。

original_image_files := $(wildcard $(CURDIR)/original_images/*)
avif: $(original_image_files)
	$(foreach file,$(original_image_files),avifenc $(file) $(CURDIR)/original_images/$$(basename $(file)).avif && ) true

Makefile 全体

init:
	docker compose up -d

run:
	docker compose exec hugo_app hugo server -D --bind="0.0.0.0"

new:
	docker compose exec hugo_app hugo new posts/`date +"%Y-%m-%d"`_.md

original_image_files := $(wildcard $(CURDIR)/original_images/*)
avif: $(original_image_files)
	$(foreach file,$(original_image_files),avifenc $(file) $(CURDIR)/original_images/$$(basename $(file)).avif && ) true

まとめ

完全な自動化ではありませんが、これで少しは楽になりそうです。