libheif 实战详解:用一套 C API 打通 HEIC 与 AVIF 的解码和编码

📅 2026/8/21 22:50:10
libheif 实战详解:用一套 C API 打通 HEIC 与 AVIF 的解码和编码
libheif 实战详解用一套 C API 打通 HEIC 与 AVIF 的解码和编码【免费下载链接】libheiflibheif is an HEIF and AVIF file format decoder and encoder.项目地址: https://gitcode.com/gh_mirrors/li/libheiflibheif 是符合 ISO/IEC 23008-12 标准的 HEIF 编解码库同时覆盖 AVIF同一套 C 接口完成 HEIC、AVIF 的解码与编码透明通道、HDR、分块大图、流式读取均可用。为什么 JPEG 之后还需要 HEIF/AVIFWeb 图片的主力仍是 JPEG 和 PNG但两者的短板很固定JPEG 在观感尚可的范围内压缩率基本到头了PNG 无损体积却惊人。HEIFHigh Efficiency Image Format一种 ISO 定义的图像容器用 HEVCH.265或 AV1 做图像编码同等质量下体积通常只有 JPEG 的一半上下还顺带装下了透明度、深度图、缩略图这些 JPEG 表达不了的信息。AVIF 可以理解为AV1 单帧图像的开放版本许可组合更宽松。格式再新总得有人把它解码成像素、再把像素打包回去。libheif 就是干这件事的库压缩本身复用 libde265、x265、AOM、rav1e、svt-av1 这些成熟 codeccodec 即压缩算法库它负责 ISO 容器解析、色彩管理和对外接口。一个文件能装什么按场景看能力一图多帧一个容器里放主图、缩略图、alpha 通道、深度图解码时按辅助图auxiliary image分别取出。透明与 HDRalpha 是标准能力HDR 图会依据内嵌的 colr/ICC 色彩描述做正确变换而不是糊成一片 SDR。无损支持 ISO/IEC 23001-17 无损存储编解码内置不引入第三方依赖。分块大图上亿像素的图不必整图解开可以逐 tile图块读取编码时也能一块一块追加写入。流式解码数据不必先下载完整通过>mkdir build cd build cmake --presetrelease .. make--preset需要 CMake 3.21 以上。四个内置 preset 分工明确release把所有 codec 编成独立插件是分发首选release-noplugins关掉插件系统、只留 HEIC 加 AVIF产物更小更自包含testing用于跑单元测试fuzzing给模糊测试用。macOS 先 brew 装齐 cmake、x265、libde265、libjpeg 等依赖再走同样流程Windows 可以直接用 vcpkg 装现成的 libheif。最小代码闭环解码与编码各 12 行解码 HEIC 和 AVIF 是同一份代码——容器层根本不关心里面的压缩格式。下面这段把主图解成 24bit 交错 RGB拿到像素指针后就能直接落盘或送进 GPUheif_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* px heif_image_get_plane_readonly(img, heif_channel_interleaved, stride); // 得到交错 RGB 像素其余资源依次释放img、handle、ctx编码方向只差一个压缩格式。有损质量档位是 0 到 100这里取 50 演示heif_context* ctx heif_context_alloc(); heif_encoder* enc; heif_context_get_encoder_for_format(ctx, heif_compression_HEVC, enc); heif_encoder_set_lossy_quality(enc, 50); heif_image* image; // 像素数据已填充 heif_context_encode_image(ctx, image, enc, nullptr, nullptr); heif_encoder_release(enc); heif_context_write_to_file(ctx, output.heic); heif_context_free(ctx);把 heif_compression_HEVC 换成 heif_compression_AV1、输出文件名改成 .avif就是 AVIF 编码。EXIF 读取不必背 API先以 Exif 为类型调用 heif_image_handle_get_list_of_metadata_block_IDs 查出块 ID再用同族接口查大小、拷贝原始字节即可。语言绑定、WASM 与周边生态C 接口意味着凡是能调 C 的语言基本开箱可用。现成绑定包括C库内自带、.NET 系C#/F#、Golibheif-go、Pythonpyheif、pillow_heif、Rustlibheif-sys、Swift、JavaFXJS/Node 路线则是用 emscripten 把整个库编译进浏览器运行官方有在线 demo。依赖方覆盖了图像领域的主力软件GIMP、Krita、ImageMagick、GraphicsMagick、darktable、digiKam、libvips、libGD、bimg、GDAL、OpenImageIO、XnView 等。仓库自带命令行工具 heif-dec、heif-enc、heif-infoHEIC 转 JPEG、JPEG 转 HEIF 或 AVIF 都是一条命令的事heif-thumbnailer 还能直接注册为 Gnome 桌面的缩略图生成器。许可证与下一步主库采用 LGPL示例程序与 C/Go 封装为 MIT商用没有障碍。建议的验证顺序构建完成后先用 examples 里的 heif-dec 转一张图确认链路通畅再用cmake --presettesting编一遍单元测试确认环境无坑要抠容器细节用 heif-info -d 把 box 结构倒出来对照阅读即可。【免费下载链接】libheiflibheif is an HEIF and AVIF file format decoder and encoder.项目地址: https://gitcode.com/gh_mirrors/li/libheif创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考