libheif 完整指南:HEIF 与 AVIF 编解码库的安装、使用与进阶集成
2026/8/22 1:52:09 网站建设 项目流程

libheif 完整指南:HEIF 与 AVIF 编解码库的安装、使用与进阶集成

【免费下载链接】libheiflibheif is an HEIF and AVIF file format decoder and encoder.项目地址: https://gitcode.com/gh_mirrors/li/libheif

libheif 是一个开源的 HEIF 与 AVIF 图像编解码库(遵循 ISO/IEC 23008-12 标准),一套 C API 同时覆盖 HEIC、AVIF、JPEG2000 等格式的读取与写入,相比 JPEG 通常能把文件体积缩小一半以上,同时保持同等甚至更高的画质。它最大的差异化优势在于:同一个解码接口可以解码所有格式,换编码格式只需换一个枚举参数,集成成本极低。

最快安装方式:CMake 预设 + 三步出包

libheif 采用 CMake 构建系统(v1.16.0 起已移除 autotools)。构建前建议先装好解码依赖:HEIC 用 libde265,AVIF 用 AOM,这样配置脚本能直接找到它们。

git clone https://gitcode.com/gh_mirrors/li/libheif cd libheif && mkdir build && cd build cmake --preset=release .. make && make install

官方在 CMakePresets.json 中提供了四个预设,覆盖绝大多数场景:

  • release(推荐):所有编解码器编译为独立插件,按需分发
  • release-noplugins:最小自包含构建,只带 HEIC + AVIF,依赖最少
  • testing:构建并运行单元测试
  • fuzzing:启用模糊测试器,供安全验证使用

macOS 下先执行brew install cmake make pkg-config x265 libde265 libjpeg libtool再走同样的构建流程即可。

5 分钟跑通第一次解码与编码:构建完成后,examples/目录下就有可执行的工具,直接用仓库自带的示例文件体验一轮:

./examples/heif-dec examples/example.heic example.jpeg # HEIC 转 JPEG ./examples/heif-enc example-1.jpeg -A -o example.avif # JPEG 转 AVIF(-A 启用 AV1)

一条命令即可在 HEIC / AVIF 之间完成互转,-A参数决定压缩格式,其余流程不变。

核心能力拆解:每个能力点帮你省了什么

  • 格式无关的统一 API—— 你不需要为 HEIC、AVIF、JPEG2000 分别写解析逻辑。heif_decode_image()对所有格式通用,换格式只是换heif_compression_HEVC/heif_compression_AV1这样的枚举,省掉整套多格式适配层。
  • 高压缩比—— HEVC/AV1 编码下,同等画质比 JPEG 小 50% 以上。对图片资源站、App 下发场景,这意味着直接节省流量和存储成本。
  • 丰富的图像语义—— 透明度通道、深度图、缩略图、辅助图像、多图像容器开箱即用,不用自己设计容器扩展。
  • HDR 与色彩管理—— 按文件内嵌的颜色配置(NCLX 等)做正确的 HDR→SDR 转换与色彩空间转换,避免"解码出来颜色不对"的踩坑。
  • 图像变换—— 裁剪、镜像、旋转、叠加图(overlay)、网格图(grid)由库内完成,服务端预处理管线不用另写。
  • 元数据读写—— EXIF、XMP 直接按块 ID 读取;区域注释与蒙版图像也受支持,做标注类产品可少维护一套私有格式。
  • 流式解码—— 通过>格式可用解码器可用编码器依赖备注HEIC (HEVC)libde265、ffmpegx265(GPL)、kvazaar(BSD)x265 有许可证约束,商用可选 kvazaarAVIF (AV1)AOM、dav1dAOM、rav1e、svt-av1三档编码器在速度/质量上可权衡VVCvvdecvvenc、uvg266新一代编码标准AVC (H.264)openh264、ffmpegx264兼容老设备JPEGlibjpeg(-turbo)libjpeg(-turbo)最轻量路径JPEG 2000OpenJPEGOpenJPEG—HTJ2K(分层 JPEG2000)OpenJPEGOpenJPH按需分块提取无损(ISO/IEC 23001-17)内置内置支持多种像素排布的无损存储

    每个后端都有两个 CMake 开关:WITH_{codec}启用编解码器,WITH_{codec}_PLUGIN决定它是内置还是动态插件。third-party/目录里还带了 aom、dav1d、rav1e、svt-av1 等后端的自编译脚本,从零搭建环境时可以直接跑。

    典型实战场景:两个最高频动作

    场景一:加载 HEIF 文件的主图像并拿到 RGB 像素(几行代码完成解码):

    heif_context* ctx = heif_context_alloc(); heif_context_read_from_file(ctx, "input.heic", nullptr); heif_image_handle* handle; heif_context_get_primary_image_handle(ctx, &handle); heif_image* img; heif_decode_image(handle, &img, heif_colorspace_RGB, heif_chroma_interleaved_RGB, nullptr); int stride; const uint8_t* data = heif_image_get_plane_readonly( img, heif_channel_interleaved, &stride); // 处理完 data 后按 img → handle → ctx 顺序释放

    解码后你拿到的就是一块 stride 交错的 RGB 缓冲区,可直接送入渲染管线。

    场景二:编码输出 HEIF/AVIF 文件

    heif_context* ctx = heif_context_alloc(); heif_encoder* encoder; heif_context_get_encoder_for_format(ctx, heif_compression_AV1, &encoder); heif_encoder_set_lossy_quality(encoder, 50); heif_image* image; // 你的 RGB 图像数据 heif_context_encode_image(ctx, image, encoder, nullptr, nullptr); heif_encoder_release(encoder); heif_context_write_to_file(ctx, "output.avif"); heif_context_free(ctx);

    其余高频操作都有对应的直白 API:读 EXIF 用heif_image_handle_get_list_of_metadata_block_IDs(handle, "Exif", ...)拿到块 ID 后再取数据;图像序列/MP4 视频、网格图、叠加图等能力在 C API 头文件中都有对应函数,可参考 heif.h 的完整声明。

    进阶话题:大图分块、插件机制与安全限制

    🛠1. 分块(Tiled)图像处理 —— 超大分辨率不再爆内存

    为什么需要:4K×8K 的航拍图或拼接图,一次性解码会瞬间吃光内存。libheif 支持把图像切成瓦片,逐个瓦片解码(编码时也可以逐块追加写入),你可以只处理视口内的瓦片。实现上通过分块图像 API 查询瓦片布局、对单个瓦片调用解码即可;构建时开启ENABLE_PARALLEL_TILE_DECODING还能让多个瓦片并行解码,进一步提速。

    2. 编解码器插件机制 —— 依赖瘦身的关键

    为什么需要:静态内置所有编解码器会拖入大量动态依赖,且分发时可能包含你不需要的(或许可证不合适的)组件。v1.14.0 起,每个后端可单独编译成动态插件,运行时从LIBHEIF_PLUGIN_PATH环境变量指定的目录(冒号分隔,Windows 为分号)加载;未设置时用构建期的PLUGIN_DIRECTORY。好处是:库本体依赖少,插件可按需安装、热替换。

    3. 安全限制 —— 防恶意文件打穿内存

    为什么需要:HEIF 是二进制容器,恶意构造的文件可能声明超大尺寸触发拒绝服务。libheif 内置heif_security_limits(像素数、瓦片数等上限)默认拦截。处理超大合法图像时可按需放宽;用heif-dec时加--disable-limits,或通过环境变量LIBHEIF_SECURITY_LIMITS=off全局关闭——文档明确提醒:仅在你确定不会处理恶意文件时再关。

    跨语言与集成

    • C:核心 API,一切绑定的基础
    • C++:heif_cxx.h 提供的头文件 only 包装,二进制兼容、代码更简洁
    • Python:pyheif、pillow_heif(后者可直接并入 Pillow 生态)
    • Go:libheif-go 封装库
    • Rust:libheif-sys 绑定
    • .NET(C#/F#):libheif-sharp
    • Java/JavaFX:LibHeifFX
    • JavaScript / WASM:可用 emscripten 把整个库编译成浏览器端 JS,实现纯前端 HEIF/AVIF 解码
    • 能直接调 C 的语言(Swift、C# 等)可零封装直接使用

    周边工具与配套

    • heif-dec / heif-enc:命令行互转工具,支持图像、图像序列与 MP4 视频
    • heif-info:文件结构概览,-d参数可转储完整 box 结构,调试格式问题必备
    • heif-view:图像序列播放器
    • heif-thumbnailer:Gnome 桌面的 HEIF/AVIF 缩略图生成器,配套 MIME 配置在 gnome/ 目录
    • gdk-pixbuf 加载器:gdk-pixbuf/ 提供 GTK 应用的原生 HEIF/AVIF 支持,安装后更新加载器缓存即可
    • 完整示例程序:examples/ 目录含解码、编码、序列、基准测试等可直接阅读的实现

    谁在用它

    libheif 是很多主流图像处理软件背后的 HEIF/AVIF 引擎:GIMP、Krita、ImageMagick、GraphicsMagick、darktable、digiKam、libvips、kImageFormats、libGD、GDAL、OpenImageIO、XnView、bimg,以及 Kodi 的 HEIF 解码插件。如果这些软件的 HEIF 支持稳定,你的集成大概率也会稳定。

    许可与社区

    • 库本体:GNU LGPL 许可,对闭源集成友好(动态链接即可)
    • 示例程序:MIT 许可
    • 详见 COPYING

    开发与维护由结构 AG 及核心维护者持续推进,编解码器覆盖范围广、有持续的模糊测试投入(fuzzing/ 目录含完整的模糊测试器与语料),问题反馈与贡献建议直接提交到仓库的 issue 区。


    一句话收束:libheif 把"HEIF/AVIF 解码编码"这件通常要对接三四个格式库的事,收敛成一套 C API 加几个 CMake 开关——你省下的是格式适配层、依赖治理和色彩转换的坑,换来的是几行代码接入当前压缩比最优的图像格式。

    【免费下载链接】libheiflibheif is an HEIF and AVIF file format decoder and encoder.项目地址: https://gitcode.com/gh_mirrors/li/libheif

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询