ImageMagick的heic解码依赖libheif库,而libheif库又依赖libde265库,所以先安装这些依赖的库
libheif安装
可以直接从仓库中安装,但一般仓库里的版本较低
bash
# 安装 `libheif` 及其开发包(包含配置文件)
yum install -y libheif libheif-devel
# 若安装了 `libheif` 的开发包(如 `libheif-devel`),可以使用 `pkg-config` 命令获取详细版本
pkg-config --modversion libheif
heif-info --version
# 测试是否支持转换heic文件
heif-convert input.heic output.png
低版本的libheif不支持IOS18以上生成的heic文件

所以我选择从较新的源码编译安装
下载源码包:发布 ·Strukturag/libheif --- Releases · strukturag/libheif

tar xzf libheif-1.19.7.tar.gz
解压后会发现没有./configure
等脚本
因为新版 libheif
已改用 CMake 作为构建系统(不再使用传统的 Autotools),需要自己安装CMake 和必要的依赖库
bash
yum install -y cmake gcc-c++ make pkgconfig libde265-devel x265-devel
cd libheif-1.19.7
# 创建构建目录并进入
mkdir build
cd build
# 运行 CMake 配置(默认安装到 /usr/local)
cmake ..
# 编译源码
make
# 安装到系统
make install
走到cmake ..
这一步时会发现cmake版本过低,至少需要CMake 3.16.3,下面处理cmake版本过低问题

bash
# 安装 CMake 3.x
yum install -y cmake3
# 创建软链接替换默认 CMake
ln -sf /usr/bin/cmake3 /usr/bin/cmake
# 验证cmake版本
cmake --version
继续从cmake ..
开始
又会提示编译器版本过低,无法支持 C++20 标准,下面解决c++20这个问题

bash
# 启用 SCL 仓库 CentOS 7 默认不包含高版本 GCC,需通过 Software Collections (SCL) 安装
yum install -y centos-release-scl
# 安装 GCC 9(或更高版本)
yum install -y devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
# 安装时可能会遇到找不到源安装失败的问题
# 备份原始文件
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
# 阿里云镜像配置
sed -i \
-e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.aliyun.com/centos-vault|g' \
/etc/yum.repos.d/CentOS-*.repo
# 清理缓存
yum clean all
yum makecache
# 再重试安装
yum install -y devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
# 激活编译器环境
# 临时激活(仅当前会话有效)
scl enable devtoolset-9 bash
# 永久激活(添加到 Shell 配置文件)
echo "source /opt/rh/devtoolset-9/enable" >> ~/.bashrc
source ~/.bashrc
# 验证编译器路径
# 编译器路径已加入 `PATH`:
which g++ # 应输出类似 /opt/rh/devtoolset-9/root/usr/bin/g++
# 验证安装
# 激活 devtoolset-9 环境
scl enable devtoolset-9 bash
# 验证 GCC 版本
gcc --version
# 输出应包含:gcc (GCC) 9.3.1
继续从cmake ..
开始,直至安装完成
libheif
库验证
确认 libheif
开发包已正确安装
bash
# 检查头文件(必须存在 heif.h)
ls -l /usr/local/include/libheif/heif.h
# 检查库文件(必须存在 libheif.so)
ls -l /usr/local/lib/libheif.so*
ls -l /usr/local/lib64/libheif.so* # 若安装在 lib64 目录
# 检查 pkg-config 配置(必须存在 libheif.pc)
ls -l /usr/local/lib/pkgconfig/libheif.pc
ls -l /usr/local/lib64/pkgconfig/libheif.pc # 若路径为 lib64
CMake 配置文件(用于项目构建)
bash
ls -l /usr/local/lib/cmake/libheif/ # 自定义安装
ls -l /usr/lib64/cmake/libheif/ # 系统级安装
# 应包含 libheifConfig.cmake 和 libheifTargets.cmake
通过 pkg-config
检测库依赖(开发场景)
1. 检查库是否被系统识别
bash
pkg-config --exists libheif
# 若返回 0(无输出),表示库存在;非 0 则表示未找到
2. 查看库详细信息(版本、包含路径、链接参数)
bash
pkg-config --modversion libheif # 查看版本(应显示 1.19.7+)
# 输出示例:1.19.7
pkg-config --cflags libheif # 查看头文件路径
# 输出示例:-I/usr/local/include/libheif
pkg-config --libs libheif # 查看链接参数
# 输出示例:-L/usr/local/lib -lheif
复 pkg-config
路径(关键)
若 libheif.pc
在 /usr/local/lib/pkgconfig/
或 /usr/local/lib64/pkgconfig/
,需确保 pkg-config
能找到:
bash
# 临时设置环境变量(当前会话有效)
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig"
# 永久生效(写入 Dockerfile 或配置文件)
echo "export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig" >> /etc/profile
source /etc/profile
ImageMagick安装
我是直接下载的较新的版本
/archive 的索引 --- Index of /archive 里面的ImageMagick-7.1.1-47.tar.gz文件
bash
tar xzf ImageMagick-7.1.1-47.tar.gz
# 清除旧配置,如果之前编译过
make clean
rm -rf config.log config.status
./configure --with-heic=yes --with-heif=yes --disable-static --disable-docs
make -j$(nproc)
make install
# 清理源码
cd ..
rm -rf ImageMagick-*
# ImageMagick安装好后更新动态链接库缓存
echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig
验证
bash
# 检查 ImageMagick 版本
magick -version
# 确认 HEIC 支持
magick -list format | grep -i heic
编译过程中执行过的其他命令,供参考
bash
tar xzf libheif-1.15.0.tar.gz
cd libheif-1.15.0
# 在 CentOS 中安装 `autoconf`、`automake` 和 `libtool`:
yum install -y autoconf automake libtool
# 进入源码目录
cd libheif-1.15.0
# 生成 configure 脚本
autoreconf -fiv
# 配置编译选项
./configure --enable-libde265 --enable-aom
# 编译并安装
make -j$(nproc)
make install
# 清理源码
cd ..
rm -rf libheif-*
# `libheif` 需要依赖 `libde265` 或 `libaom` 来解码 HEIC 文件。如果未安装这些库,即使编译了 `libheif`,也无法实际处理 HEIC。
# 安装依赖工具
yum install -y cmake
# 下载并编译 libde265
wget https://github.com/strukturag/libde265/releases/download/v1.0.12/libde265-1.0.12.tar.gz
tar -xzf libde265-1.0.12.tar.gz
cd libde265-1.0.12
./configure
# 若提示缺少No package 'QtCore' found No package 'QtGui' found
# 安装 Qt5 开发包(包含 QtCore/QtGui)
yum -y install qt5-qtbase-devel # 核心开发包,包含 QtCore/QtGui
make -j$(nproc)
make install
# 检查文件元数据
exiftool IMG_2231.HEIC
# ImageMagick安装好后更新动态链接库缓存
echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig
问题
低版本的libheif不支持高版本heic格式问题
bash
identify: Invalid input: Unspecified: Metadata not correctly assigned to image (2.0) `failure_magick.HEIC' @ error/heic.c/IsHEIFSuccess/139.
解决:升级libheif版本,重新编译安装ImageMagick