はじめに
この記事は、「最新版の 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) でも同様の論理で解決します。
依存ライブラリを揃える
Bashsudo apt update sudo apt install -y build-essential pkg-config libpng-dev libjpeg-dev libtiff-dev libwebp-dev
ポイント:libpng-dev を忘れると以降の作業が無意味になります。
最新の ImageMagick をダウンロードして展開
Bashwget https://imagemagick.org/archive/ImageMagick.tar.gz tar xf ImageMagick.tar.gz cd ImageMagick-7*
configure で delegate パスを明示する
多くの失敗例は「何も指定しないまま ./configure している」だけ。
pkg-config で libpng が見えるか先に確認:
Bashpkg-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
Bashmake -j$(nproc) sudo make install sudo ldconfig # 共有ライブラリキャッシュを更新
動作確認
Bashconvert -list delegate | grep png # 出力例: # png => "libpng" ... convert logo: /tmp/logo.png identify /tmp/logo.png # => /tmp/logo.png PNG 640x480 ...
これで PNG の読み書きが可能になります。
ハマったポイントとエラー例
-
エラー:
convert: no decode delegate for this image format 'PNG' @ error/constitute.c/ReadImage/572
原因: configure 時に libpng が見えていないか、--with-png=no になっている。 -
エラー:
convert: delegate library support not built-in 'logo.png' (libpng) @ error/png.c/MagickPNGErrorHandler/...
原因: ビルド時に libpng ヘッダーは見えたが、ランタイムで共有ライブラリが見えていない。ldconfig し忘れか LD_LIBRARY_PATH が通っていない。 -
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
