🪄

Amazon Linux 2 に HEIC 変換に対応した ImageMagick 7 をインストールする

2023/09/14に公開

Amazon Linux 2 に HEIC 変換に対応した ImageMagick 7 をインストールしようとしたらとても大変だったので備忘録を残しておきます。

以下の Dockerfile で動くと思うので、急ぎの方はご利用ください。
たくさんビルドしないといけないので、30分以上かかります。

Dockerfile
FROM amazonlinux:2

WORKDIR /imagemagick

# pkg-config のパスを通す
ENV PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH

# 動的ライブラリ(.soファイル)の検索パスを追加
ENV LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH

# yum でインストール可能な依存関係をインストール
RUN yum update -y && \
    yum install -y \
    gcc \
    gcc-c++ \
    git \
    make \
    wget \
    tar \
    gzip \
    pkg-config \
    libtool \
    openssl-devel \
    libpng-devel \
    libjpeg-turbo-devel \
    gdk-pixbuf2-devel && \
    yum clean all

# cmake をビルド&インストール
RUN wget https://cmake.org/files/v3.27/cmake-3.27.0.tar.gz && \
    tar -xvzf cmake-3.27.0.tar.gz && \
    cd cmake-3.27.0 && \
    ./bootstrap && \
    make && \
    make install

# libde265 をビルド&インストール
RUN git clone https://github.com/strukturag/libde265.git -b v1.0.12 libde265 && \
    cd libde265 && \
    mkdir build && \
    cd build && \
    cmake .. && \
    make && \
    make install

# libheif をビルド&インストール
RUN git clone https://github.com/strukturag/libheif.git -b v1.16.2 libheif && \
    cd libheif && \
    mkdir build && \
    cd build && \
    cmake --preset=release .. && \
    make && \
    make install

# ImageMagick をビルド&インストール
RUN wget https://imagemagick.org/download/ImageMagick-7.1.1-15.tar.gz && \
    tar -xzf ImageMagick-7.1.1-15.tar.gz && \
    cd ImageMagick-7.1.1-15 && \
    ./configure && \
    make && \
    make install

解説

上記 Dockerfile のコメントに書いてある通りなのですが、こうなった経緯を書いておきます。

libheif と cmake

HEIC に対応した ImageMagick をビルドするには、予め libde265libheif がインストールしてある必要があります(同じ作者です)。

libheif に関しては、2023年5月にリリースされたv1.16.0で autotools を用いたビルド方式が完全に削除 されています。そのため、現在は cmake を用いたビルドのみに対応 しており、cmake のインストールが必要になります。

yum でインストールできる cmake はv2系までのようなので、3系をインストールするためにはソースからビルドする必要があります。そのため、cmake のビルドからこの Dockerfile はスタートしています。

また、cmake でビルドするためには pkg-config の設定が必要です。ENV PKG_CONFIG_PATH=… でパスを通しているのはそのためです。

libde265 はまだ autotools を用いたビルドができるようですが、いずれ削除されると思われるのでこちらも cmake でビルドするようにしています(libheif のビルドには libde265 が必要)。

ImageMagick のビルドと動的ファイルのリンク

それ以外に ImageMagick 関連で yum install しているものについては以下があります。

  • libpng-devel: PNG に対応するために必要
  • libjpeg-turbo-devel: JPEG に対応するために必要
  • gdk-pixbuf2-devel: 画像ファイルのロード、保存、変換、レンダリングなどを行うためのライブラリ

ImageMagick 自体は、yum でインストールできる ImageMagick は6系までなのと、HEIC対応するためにこちらもソースからビルドしています。

最後に ENV LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH してる部分ですが、libde265, libheif, ImageMagick を make install した時に配置される .so ファイルが上記のパスになっていて、それを検索パスに追加しています。

make install した実行結果を見ると、どこにインストールしているかが書いてあります。

$ pwd
/imagemagick/libheif/build
$ make install
[ 49%] Built target heif
[ 52%] Built target heif-info
[ 64%] Built target heif-convert
[ 77%] Built target heif-enc
[ 81%] Built target heif-test
[ 89%] Built target heif-thumbnailer
[ 96%] Built target heif-libde265
[100%] Built target pixbufloader-heif
Install the project...
-- Install configuration: "Release"
-- Up-to-date: /usr/local/lib64/libheif
-- Up-to-date: /usr/local/lib64/pkgconfig/libheif.pc
-- Up-to-date: /usr/local/bin/heif-info
-- Up-to-date: /usr/local/share/man/man1/heif-info.1
-- Up-to-date: /usr/local/bin/heif-convert
-- Up-to-date: /usr/local/share/man/man1/heif-convert.1
-- Up-to-date: /usr/local/bin/heif-enc
-- Up-to-date: /usr/local/share/man/man1/heif-enc.1
-- Up-to-date: /usr/local/bin/heif-thumbnailer
-- Up-to-date: /usr/local/share/man/man1/heif-thumbnailer.1
-- Up-to-date: /usr/local/lib64/libheif/libheif-libde265.so
-- Up-to-date: /usr/local/lib64/libheif.so.1.16.2
-- Up-to-date: /usr/local/lib64/libheif.so.1
-- Up-to-date: /usr/local/lib64/libheif.so
...

ビルドした ImageMagick に対応しているかどうかは magick -list format に HEIC が含まれているかどうかで確認できます。

$ magick -list format | grep HEIC
     HEIC  r--   High Efficiency Image Format (1.16.2)

configure 実行時に表示される設定値で HEIC が yes になっていたら OK です(no だとやり直し)

HEIC              --with-heic=yes		yes         成功!
HEIC              --with-heic=yes		no          やり直し!

cmake によるビルドもそうなのですが、パスの設定にけっこうハマってしまいました。ライブラリは協調して動くので当たり前なのですが、何も分からないところから正解を見つけるのは大変でした。

おまけ

以下のように Multi-stage build すると少しイメージを小さくできます(200MB くらい)。

Dockerfile
FROM amazonlinux:2 as build-stage

WORKDIR /imagemagick

# pkg-config のパスを通す
ENV PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH

# yum でインストール可能な依存関係をインストール
RUN yum update -y && \
    yum install -y \
    gcc \
    gcc-c++ \
    git \
    make \
    wget \
    tar \
    gzip \
    pkg-config \
    libtool \
    openssl-devel \
    libpng-devel \
    libjpeg-turbo-devel \
    gdk-pixbuf2-devel && \
    yum clean all

# cmake をビルド&インストール
RUN wget https://cmake.org/files/v3.27/cmake-3.27.0.tar.gz && \
    tar -xvzf cmake-3.27.0.tar.gz && \
    cd cmake-3.27.0 && \
    ./bootstrap && \
    make && \
    make install

# libde265 をビルド&インストール
RUN git clone https://github.com/strukturag/libde265.git -b v1.0.12 libde265 && \
    cd libde265 && \
    mkdir build && \
    cd build && \
    cmake .. && \
    make && \
    make install

# libheif をビルド&インストール
RUN git clone https://github.com/strukturag/libheif.git -b v1.16.2 libheif && \
    cd libheif && \
    mkdir build && \
    cd build && \
    cmake --preset=release .. && \
    make && \
    make install

# ImageMagick をビルド&インストール
RUN wget https://imagemagick.org/download/ImageMagick-7.1.1-15.tar.gz && \
    tar -xzf ImageMagick-7.1.1-15.tar.gz && \
    cd ImageMagick-7.1.1-15 && \
    ./configure && \
    make && \
    make install

# 実行ステージ
FROM amazonlinux:2

# 実行に必要なファイルのみをコピー
COPY --from=build-stage /usr/ /usr/

# 動的ライブラリ(.soファイル)の検索パスを追加
ENV LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH
アルダグラム Tech Blog

Discussion