AVIF 入りの ImageMagick をビルドする
はじめに
HDR の AVIF を作りたかったので ImageMagick ならできるかなあとあれこれビルドしてみてました。結論的には (現在の ImageMagick では) できないとなったのですが、ビルド手順を備忘録的にまとめておきます。
ImageMagick は様々なフォーマットに対応していますが、デフォルトでなんでもかんでも対応しているわけではありません。今回は
- OpenEXR
- JPEG XR
- AVIF
に対応した ImageMagick を準備します。バージョンは "Version: ImageMagick 7.0.11-1 Q16 x86_64" です。
JPEG XR は Windows で HDR のキャプチャをした際に保存される形式ですが、意外と対応アプリが少ないらしく扱いに困ってしまうフォーマットなのですが、 OpenEXR は対応アプリが多いと思いますので ImageMagick で HDR のままコンバートして使うとよいのではないかと思います。
環境
今回は Windows 10 (20H2) + WSL 2 (Ubuntu 20.04) で行いました。
ビルド
パッケージのインストール
下記をインストールします。
$ sudo apt install pkg-config
$ sudo apt install openexr
$ sudo apt install libjxr-tools
$ sudo apt install cmake
libheif のビルド
libheif は HEIF 系の静止画像を扱うライブラリで、 ImageMagick の AVIF は libheif で扱います。
apt でも libheif のパッケージはインストール可能でしたが、私が試した時はバージョンが古く、 AVIF に対応していませんでした。
まずチェックアウト。
$ git clone https://github.com/strukturag/libheif.git
$ cd libheif
AVIF は中身的には AV1 なので AV1 のデコーダー/エンコーダーが必要です。これは確認していませんが libaom でいけるはず。
$ sudo apt install libaom-dev
今回は dav1d (decorder) と rav1e (encorder) で作業したのでそちらの手順で (libaom を使うなら不要で libheif のビルドへ) 。
dav1d / rav1e のビルド
dav1d / rav1e を使う場合の注意点として、 デコード/エンコードの片方しか使わないとしてもこの両方がセットで必要です。 私は出力しかしないので最初 rav1e だけにしていたら実行時エラーとなって頭を抱えていました。 libaom は両方とも含んでいるので問題ないはずです。
rav1e は Rust 製なので Rust のインストールが必要です。
dav1d と rav1e は libheif 内にビルドスクリプトが用意されているのでそれを使いました。
$ sudo apt install ninja-build
$ sudo apt install meson
$ sudo apt install nasm
$ cd third-party
$ ./rav1e.cmd
$ ./dav1d.cmd
$ cd ..
ビルドしたものはそれぞれ third-party/rav1e/dist, third-party/dav1d/dist 以下に配置されるので、 PKG_CONFIG_PATH にパスを通します。
$ export PKG_CONFIG_PATH=$(libheifのパス)/third-party/rav1e/dist/lib/pkgconfig;$(libheifのパス)/third-party/dav1d/dist/lib/x86_64-linux-gnu/pkgconfig
libheif のビルド
cmake でビルドする。
$ cd ..
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
ImageMagick のビルド
の手順通り。
$ git clone https://github.com/ImageMagick/ImageMagick.git ImageMagick-7.0.11
$ cd ImageMagick-7.0.11
$ ./configure --with-modules
$ make
- OpenEXR は openexr のパッケージを ImageMagick の make 前に install する
- JPEG XR は JxrDecApp と JxrEncApp というアプリが必要なので後から libjxr-tools をインストールするでもよい (pre-built の ImageMagick を使う場合でも JPEG XR の対応には別途インストールが必要なはず)
- AVIF は前項の通り libheif の事前インストールが必要
フォーマットが依存しているライブラリの情報は下記にまとまっています。
ImageMagick での AVIF の HDR 出力
現時点では 2 つの理由で対応できないと判断しました。
AV1 のエンコードオプションが指定できない
多分デフォルトのみ。
heif_encoding_options というものを外部から指定できればいけそうな雰囲気はありそう。
ColorSpace に BT.2100 PQ が含まれていない
$ identify -list colorspace
で確認。長いので省略。
$ identify -list colorspace | grep Rec
Rec601YCbCr
Rec709YCbCr
この辺は当然のようにあるので HEIF の HDR 対応が進むなら合わせて実装されるとは思います。
現時点では AVIF を 10bit/12bit で出せたとしても、事前に色空間変換をしておいて、かつ ImageMagick での色空間変換処理を行わない設定にする必要がありますね。
おわりに
今回は目的の達成ができませんでしたが、他にも方法がありそうなので試していくつもりです。
Discussion