CentOS安装libheif及ImageMagick支持heic文件转换

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.

无法处理在 iOS18 iPhone 上拍摄的 HEIC 图像 ·ImageMagick/ImageMagick (图像魔术) ·讨论 #7426 ·GitHub 的 --- Failure to process HEIC images taken on iOS18 iPhone · ImageMagick/ImageMagick · Discussion #7426 · GitHub

解决:升级libheif版本,重新编译安装ImageMagick

相关推荐
德育处主任21 天前
把「无聊」做成了副业
图片资源
爱丶不疚1 个月前
Sharp 图片压缩那些事
前端·性能优化·图片资源
古茗前端团队1 个月前
前端上传图片处理:缩放、旋转、移动与裁剪
图片资源
古茗前端团队2 个月前
前端视角下的图像格式进化论:从像素战争到性能革命
图片资源
爱丶不疚2 个月前
用过Blurhash渐进式加载图片吗?没有的话我劝你慎用
前端·性能优化·图片资源
老A的AI实验室4 个月前
赛博周刊·2024年度工具精选(图片资源类)
人工智能·ai·llm·大语言模型·图片资源·genai
冒泡的肥皂10 个月前
用java做个图片处理网站过程遇到的坑
后端·mvc·图片资源
pycode10 个月前
使用Python生成图片验证码
python·图片资源
字节跳动技术团队1 年前
抖音Android端图片优化实践
性能优化·图片资源