はじめに

この記事は、「最新版の ImageMagick をソースからビルドしたら、なぜか PNG が読めない!」という苦情をよく聞く開発者向けです。
パッケージマネージャの古いバージョンを避けて自分で make したはいいものの、convert してみたら no decode delegate for this image format というエラーが出てハマった方も多いはず。
この記事を読めば、delegate ライブラリ(libpng 等)のリンクが失敗する仕組みと、configure オプション一つで PNG を使えるようになる正しい手順が丸わかります。

前提知識

  • Linux/macOS でのターミナル基本操作(cd, tar, make, pkg-config 等)
  • ソースコードからビルドするための gcc/clang 環境があること
  • ImageMagick が画像フォーマットを delegate(委託)ライブラリに丸投げしている仕組みをざっくり知っているとなお良い

PNG が読めないのは「delegate 不足」が原因

ImageMagick は数百の画像形式を自前で実装していません。
PNG は libpng(と zlib)に、JPEG は libjpeg-turbo に、それぞれ処理を「委託」しています。
configure 時に --with-png=yes を付けても、pkg-config が libpng を見つけられなければ delegate 一覧に組み込まれず、実行時に「デコード委託先がいない」というエラーが出ます。
つまり「ImageMagick が PNG を扱えない」≒「delegate ライブラリがビルド時にリンクされていない」のです。

ソースビルドで PNG delegate を正しくリンクさせる手順

以下は Ubuntu 22.04 を想定した例ですが、macOS (Homebrew) でも同様の論理で解決します。

依存ライブラリを揃える

Bash
sudo apt update sudo apt install -y build-essential pkg-config libpng-dev libjpeg-dev libtiff-dev libwebp-dev

ポイント:libpng-dev を忘れると以降の作業が無意味になります。

最新の ImageMagick をダウンロードして展開

Bash
wget https://imagemagick.org/archive/ImageMagick.tar.gz tar xf ImageMagick.tar.gz cd ImageMagick-7*

configure で delegate パスを明示する

多くの失敗例は「何も指定しないまま ./configure している」だけ。
pkg-config で libpng が見えるか先に確認:

Bash
pkg-config --exists libpng && echo OK || echo NG

OK が出たら、次を実行:

Bash
./configure \ --prefix=/usr/local \ --with-png=yes \ --with-jpeg=yes \ --with-tiff=yes \ --with-webp=yes \ --disable-openmp \ --enable-shared \ CFLAGS="$(pkg-config --cflags libpng)" \ LIBS="$(pkg-config --libs libpng)"

LIBS-lpng を書き込むことで、delegate 一覧に PNG が組み込まれます。

make & install

Bash
make -j$(nproc) sudo make install sudo ldconfig # 共有ライブラリキャッシュを更新

動作確認

Bash
convert -list delegate | grep png # 出力例: # png => "libpng" ... convert logo: /tmp/logo.png identify /tmp/logo.png # => /tmp/logo.png PNG 640x480 ...

これで PNG の読み書きが可能になります。

ハマったポイントとエラー例

  1. エラー: convert: no decode delegate for this image format 'PNG' @ error/constitute.c/ReadImage/572
    原因: configure 時に libpng が見えていないか、--with-png=no になっている。

  2. エラー: convert: delegate library support not built-in 'logo.png' (libpng) @ error/png.c/MagickPNGErrorHandler/...
    原因: ビルド時に libpng ヘッダーは見えたが、ランタイムで共有ライブラリが見えていない。ldconfig し忘れか LD_LIBRARY_PATH が通っていない。

  3. macOS で Homebrew 版 libpng を混ぜていると pkg-config のパスが二重化
    configure 中に -I/usr/local/include/libpng16 が重複して警告が出る。
    対策:PKG_CONFIG_PATH=/opt/homebrew/lib/pkgconfig:/usr/local/lib/pkgconfig ./configure ... を明示。

解決策まとめ

  • 必ず pkg-config --libs libpng が出力可能な状態にしてから configure すること
  • --with-png=yes は省略形だが、バージョンによっては yes ではなく auto になり失敗することがあるため、明示的に yes を指定するか、パスをフルで与える
  • ビルド後は convert -list configure | grep DELEGATES で PNG が含まれているか一目で確認
  • 共有ライブラリのキャッシュ更新(ldconfig または macOS での sudo update_dyld_shared_cache)を忘れずに

まとめ

本記事では、ソースビルドした ImageMagick が PNG を扱えない理由(delegate ライブラリ未リンク)と、libpng を正しく読み込ませるための手順を解説しました。

  • delegate ライブラリが存在しても、configure 時に見えなければ PNG は使えない
  • ./configure CFLAGS="$(pkg-config --cflags libpng)" LIBS="$(pkg-config --libs libpng)" 一行で事足りる
  • ビルド後は convert -list delegate で PNG が入っているか必ず検証

この知識があれば、パッケージマネージャに縛られず最新の ImageMagick を使いつつ、必要なフォーマットを全部有効にできます。
次回は「WebP や HEIC も含めて一発で全部有効にする Docker マルチステージビルド」の記事を予定しています。

参考資料

  • ImageMagick 公式ドキュメント: https://imagemagick.org/script/install-source.php
  • libpng 公式: http://www.libpng.org/pub/png/libpng.html
  • 私のハマり記録(Qiita): https://qiita.com/kousukei/items/xxxxx