ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

libheif 实战指南:HEIF/AVIF 编解码从入门到生产落地

libheif 实战指南:HEIF/AVIF 编解码从入门到生产落地 libheif 实战指南HEIF/AVIF 编解码从入门到生产落地【免费下载链接】libheiflibheif is an HEIF and AVIF file format decoder and encoder.项目地址: https://gitcode.com/gh_mirrors/li/libheif你的手机早就能用 HEIC 拍照不少网站也在悄悄铺 AVIF——这两种图片格式背后都是同一个开源项目libheif。它是一个 C 语言库实现 HEIF 解码与 AVIF 编码还顺带覆盖 VVC、AVC、JPEG2000、无损压缩等格式一套 API 就能把它们统一处理。为什么照片该从 JPEG 迁移HEIF 和 AVIF 解决的三个问题第一个理由最实在体积。HEIC 用 HEVCH.265编码AVIF 用 AV1两者都是当下图像压缩的第一梯队同画质下比 JPEG 小一半以上——图片上 CDN、走移动网络加载时这个差距能直接换成带宽和流量钱。第二个是能力缺口。JPEG 只能存一张有损 RGB 图而 HEIF 一个文件里可以带 alpha 通道、深度图、缩略图、多张图片EXIF 和 XMP 元数据也能原样内嵌不用像以前那样拆成几个文件。第三个是规模和动态范围。超高分辨率图片可以按图块tile组织边下边解码、逐块处理HDR 图像会按文件里嵌的颜色配置做正确转换不会一解码就发灰。裁剪、镜像、旋转、叠加图、区域标注、蒙版这些常见操作也都有对应接口。仓库在 examples/ 目录放了两种格式的样张装好工具后可以直接上手对比。30 秒装好三个 CMake preset 各管一件事 构建系统只有 CMake 一套autotools 在 v1.16.0 之后彻底移除常用参数已经写进 CMakePresets.json 文件里你不用背一堆 -D 开关git clone https://gitcode.com/gh_mirrors/li/libheif cd libheif mkdir build cd build cmake --presetrelease .. make四个 preset 各对应一类场景release把所有编解码器编译成独立插件是官方推荐release-noplugins出自包含的最小构建只留 HEIClibde265 x265和 AVIFAOM这条主线依赖少、体积小testing打开单测和实验特性fuzzing继承 release 并启用模糊器。注意两点--preset需要 CMake ≥ 3.21各编解码库要提前装好configure 阶段靠 pkg-config 找它们。还有个值得留意的架构设计从 v1.14.0 起每个编解码后端既可以静态链进库也可以做成动态加载的插件。插件模式下一个LIBHEIF_PLUGIN_PATH环境变量Linux 冒号、Windows 分号分隔就能指向插件目录主库加上一组插件文件即可覆盖全部格式分发和打包都省不少事。一套 API 解所有格式完整的 HEIF/AVIF 解码流程 libheif 最省事的地方在于解码 HEIC、AVIF、JPEG 用的是同一套调用换格式只发生在编码侧。核心流程四步——建上下文、拿图像句柄、解码并转成 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* px heif_image_get_plane_readonly(img, heif_channel_interleaved, stride);拿到px后按需处理像素结束时按相反顺序释放img、handle、ctx即可。写入方向反过来调用heif_context_encode_image()之后接一句heif_context_write_to_file()落盘。输出什么格式看编码器的选择heif_encoder* enc; heif_context_get_encoder_for_format(ctx, heif_compression_AV1, enc); heif_encoder_set_lossy_quality(enc, 50);把heif_compression_AV1换成heif_compression_HEVC同一张图就写成了 HEIC。读 EXIF/XMP 也是两句话的事先用heif_image_handle_get_list_of_metadata_block_IDs()拿块 ID再用heif_image_handle_get_metadata()取原始字节。进阶玩法逐块解码、边下边解、跑进浏览器过了“解一张图”的阶段后这几个能力会频繁用到分块图像超大图按 tile 逐块解码编码时还能一个 tile 一个 tile 地追加内存占用不再跟着图片面积走流式解码实现heif_reader数据读取接口后libheif 按需取数还会通过request_range预告要预载的字节区间——网络没下载完就可以开始解码插件加载如前所述编解码器即插即用同一份主库在不同部署环境换插件即可编译到 JS/WASM用 emscripten 能把整个库打进浏览器USE_WASM1启用 WASM 输出前端图像处理不用再过一道后端。想深挖实现的话各编解码器的代码都集中在 libheif/codecs/ 目录下HEVC、AVIF、VVC、JPEG2000 各有独立的 box 解析和解码/编码对。跨语言生态从你的项目调用 libheif 的几条路C API 是底座往上的绑定已经比较成熟C 封装直接包含在库内heif_cxx.hGo 有仓库 go/ 目录里的官方绑定Python 有 pyheif 和 pillow-heifRust 有 libheif-sys能直接调 C 的语言Swift、C#/.NET 等拿来即用WASM 编译则让 JavaScript 也能调用。下游生态你大概率已经接触过GIMP、Krita、ImageMagick、GraphicsMagick、libvips、darktable、digiKam、kImageFormats、libGD 都靠 libheif 处理 HEIF/AVIF。仓库 heifio/ 目录里还有一组命令行工具heif-dec把文件里的全部图片转出 JPEG/PNGheif-enc把 JPEG 转成 HEIC加-A转 AVIFgnome/ 目录则提供 Gnome 桌面缩略图生成配置。⚠️下一步建议先用heif-info、heif-dec跑一遍 examples/ 里的样张建立对文件结构的直观感受集成到自己项目时建议从cmake --presetrelease-noplugins起步。一个常见坑编解码库如果在 configure 之后才装好插件不会被生成需要重新跑一遍 configure。许可证libheif 以 GNU LGPL-3.0-or-later 发布示例程序为 MIT。【免费下载链接】libheiflibheif is an HEIF and AVIF file format decoder and encoder.项目地址: https://gitcode.com/gh_mirrors/li/libheif创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表