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 照片在 Windows 资源管理器里只剩一个灰图标或者你想给 Web 页面换上比 JPEG 小一半的 AVIF却发现手头没有现成的 C API。libheif就是一个 HEIF/AVIF 编解码库——按 ISO/IEC 23008-12 标准实现解码与编码同一套代码既能打开 HEIC也能打开 AVIF顺带还支持 VVC、AVC、JPEG、JPEG2000 和 ISO/IEC 23001-17 无损格式。先别急着看 API 细节用这张表判断它值不值得进你的技术栈。一张表看懂能力从看 HEIC 到压 AVIF场景libheif 能做什么看手机拍回的 HEIC 图libde265、ffmpeg 解码x265、kvazaar 编码把大照片压成 AVIF 上线AOM、dav1d 解码AOM、rav1e、svt-av1 编码无损归档JPEG2000OpenJPEG、HTJ2KOpenJPH、内置无损编解码器处理超高分辨率大图按图块tile逐个解码、逐块编码HDR 照片依据嵌入的颜色配置文件做正确颜色转换透明通道、缩略图、深度图辅助图像、区域注释、图像序列、MP4 视频另外几个值得知道的点任何格式的 C API 都相同——解码代码写一次HEIC、AVIF 或其他格式通用支持流式解码网络数据边下载边可以开始解码一个文件里可以放多张图、图像序列甚至 MP4 视频不含音频无损格式内置在库里不依赖任何外部编解码后端。表格看腻了直接动手。 装好第一个解码器从 git clone 到 make前提是把系统里的编解码后端装齐——官方建议先编译安装 libde265HEIC 解码用再配上 x265 或 kvazaarHEIC 编码和 AOMAVIF。macOS 一条 brew 命令即可Linux 用包管理器或源码编译。然后git clone https://gitcode.com/gh_mirrors/li/libheif cd libheif mkdir build cd build cmake --presetrelease .. make sudo make install注意--preset需要 CMake 3.21 以上release会把各编解码器编译成独立插件想要单文件自包含库可以换成release-noplugins。跑完 make install你就有了一个同时能干 HEIC 和 AVIF 的本地库。解码一张 HEIC 图第一次要跑的是解码从 HEIC 文件里取出主图像转成 24 位交错 RGB拿到像素指针。heif_context* ctx heif_context_alloc(); heif_context_read_from_file(ctx, photo.heic, nullptr); heif_image_handle* img; heif_context_get_primary_image_handle(ctx, img); heif_image* rgb_img; heif_decode_image(img, rgb_img, heif_colorspace_RGB, heif_chroma_interleaved_RGB, nullptr); int stride; const uint8_t* rgb heif_image_get_plane_readonly(rgb_img, heif_channel_interleaved, stride); // rgb 就是像素指针 heif_image_release(rgb_img); heif_image_handle_release(img); heif_context_free(ctx);这一步你只做了一件事把压缩码流变回能直接往画布上画的 RGB 像素stride 是每一行的实际字节宽度。把一张 JPEG 压进 AVIF编码路径和解码几乎对称关键就是传给heif_context_get_encoder_for_format()的格式参数——换成heif_compression_AV1产物就从 .heic 变成 .avifheif_context* ctx heif_context_alloc(); heif_encoder* enc; heif_context_get_encoder_for_format(ctx, heif_compression_AV1, enc); heif_encoder_set_lossy_quality(enc, 50); heif_image* pic; // 假设已填好像素数据 heif_context_encode_image(ctx, pic, enc, nullptr, nullptr); heif_encoder_release(enc); heif_context_write_to_file(ctx, output.avif); heif_context_free(ctx);跑完你会得到一个质量 50 的 AVIF 文件。不想自己写代码的话HEIC 转 JPEG 这类场景 examples/ 里的 heif-dec 现成可用。把 EXIF 元数据拿出来元数据不走解码流程直接从图像句柄上取就行heif_item_id exif_id; int n heif_image_handle_get_list_of_metadata_block_IDs( img, Exif, exif_id, 1); if (n 1) { size_t sz heif_image_handle_get_metadata_size(img, exif_id); uint8_t* buf (uint8_t*)malloc(sz); heif_image_handle_get_metadata(img, exif_id, buf); }跑完之后buf 里就是 EXIF 原始字节流快门、GPS 这些信息要么自己解析要么丢给现成的 EXIF 库处理。三步走下来基础能力已经齐了再决定要不要往下挖。如果你还想深入插件、语言绑定和浏览器想不重编库就换 HEVC 解码器或塞进一个新编解码器 → 用 libheif 插件机制v1.14.0 起每个编解码后端既可静态编进库里也可编译成动态插件插件从环境变量LIBHEIF_PLUGIN_PATH指定的目录列表里加载项目是 Go、Python、C#、Rust → 有对应绑定C API 是库内自带的 header-only 封装Go 有 libheif-goPython 有 pyheif 和 pillow_heifRust 有 libheif-sys.NET 系语言直接调 C API想在浏览器里跑 → 用 emscripten 编成 JavaScript 或 WASM同一套 C API 原样工作想看真实输入输出 → heif-dec、heif-enc、heif-info 三个示例程序放在 examples/ 目录想给 Gnome 桌面显示 HEIC 缩略图 → 用 heif-thumbnailer对应的 Gnome 配置文件在 gnome/ 目录担心它不成熟 → GIMP、Krita、ImageMagick、libvips、darktable 这些软件已经生产环境在用。libheif 按 GNU LGPL 许可证分发商业集成没有额外费用。打开终端把第一条 git clone 敲进去十分钟后你就能拿到自己解出的第一帧 RGB 像素。【免费下载链接】libheiflibheif is an HEIF and AVIF file format decoder and encoder.项目地址: https://gitcode.com/gh_mirrors/li/libheif创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表