no encode delegate for this image format(AVIF、HEIC、WebP)
格式支持是编译进 ImageMagick 的,不是靠参数打开。如何查看你的版本支持什么,以及怎么换一个带对应格式的版本。
convert: no encode delegate for this image format 'WEBP' @ error/constitute.c/WriteImage/1265
convert: no decode delegate for this image format 'HEIC' @ error/constitute.c/ReadImage/575
这是什么意思
ImageMagick 自己并不实现大部分编解码器。它是在编译时链接外部库 —— libwebp、libheif、libjxl、libraw。如果你的二进制文件编译时没带上某个库,任何命令行参数都补不上。支持要么在里面,要么不在。
先看你有什么
magick -list format | grep -iE 'webp|heic|avif|jxl'
WEBP* WEBP rw- WebP Image Format (libwebp 1.3.2)
HEIC HEIC r-- High Efficiency Image Format
那三个字符分别是读、写、多图支持。上面这个例子里 WebP 能读能写,HEIC 只能读。列表里完全没有的格式就是完全不支持。
另外两个有用的命令:
magick -version # DELEGATES 那行列出了编译进去的库
magick -list delegate # 它能调用的外部程序
换一个带这个格式的版本
macOS
brew install imagemagick
Homebrew 的版本包含 WebP、HEIC 和 AVIF。装得早的话跑一下 brew upgrade imagemagick。
Debian / Ubuntu
官方源的 imagemagick 包常常没有 HEIC,有时也没有 AVIF。装上额外的委托库:
apt install imagemagick libmagickcore-6.q16-6-extra
apt install libheif1 libheif-plugin-libde265 # HEIC/AVIF 解码
还不够的话,官网的 AppImage 是一个功能齐全的 IM7 版本,不用编译:
wget https://imagemagick.org/archive/binaries/magick
chmod +x magick
./magick -list format | grep -i heic
Alpine
apk add imagemagick imagemagick-heic imagemagick-webp imagemagick-jpeg
Alpine 把每个委托库拆成了独立的包,所以只装 imagemagick 几乎什么格式都不支持。这坑了很多做小体积 Docker 镜像的人。
各格式的说明
- HEIC —— 需要 libheif。读 iPhone 照片还需要一个 HEVC 解码器(比如 libde265),有些发行版出于专利原因不带 —— 这就是为什么装了 libheif 之后 HEIC 依然显示不支持。
- AVIF —— 需要带 libaom 或同类 AV1 编码器的 libheif。编码很慢,大照片要好几秒。
- JPEG XL —— 需要 libjxl 和较新的 ImageMagick,各发行版支持还很不一致。
- RAW(CR2、NEF、ARW) —— 委托给
dcraw或libraw,需要单独安装。
换不了版本时的绕法
# WebP 用官方编码器
cwebp -q 80 input.png -o output.webp
dwebp input.webp -o output.png
# HEIC 用 libheif 自带的工具
heif-convert input.heic output.jpg
# AVIF 用 libavif
avifenc --min 20 --max 30 input.png output.avif
用专门的工具转格式,其他处理再交给 ImageMagick。在流水线里这样往往还更快。