随着软硬件技术的不断升级,相机像素越来越高、人们对照片细节的要求越来越多,高压缩率、低损失率的编码格式,heic 越来越多地出现在人们的生活中,现在 iOS 相机已经默认保存 heic 格式的图片了。而通常情况下,FFmpeg 是不支持对 heif 解析的。

无法解析 heic 格式的 FFmpeg

当第一次遇到 HEIC 格式的图片时,遇到了 FFmpeg 的报错,av_format_open_input() 这个接口的调用就失败了,也就是说,FFmpeg 对 HEIC 这种封装格式没法解析。

简单了解了一下 HEIC 相关的知识点,它是使用 hevc,也就是 h265 编码格式压缩的。因此,解码其实并不是问题的所在,heic 的封装格式才是。

自带示例 demo 的 libheif

通过查资料发现,一个比较常见的 C++ 解析解码 heic 格式图片的开源库是 libheif,而这个库对 h265 的解码过程又依赖于另一个开源 C++ 库 libde265。

同时从 github 上下载了这两个开源库。根据 github 上两个库 readme.md 的内容,依次编译通过 libde265 和 libheif 之后,就可以参考 libheif/examples/heif_convert.cc 来完成一个简单的对 HEIC 格式图片的解析、解码的过程。主要调用的函数如下:

#include <libheif/heif.h>
bool decodeheif(string filename) {// 类似于 ffmpeg AVFormatContext,heif 也需要一个上下文环境heif_context* heif_ctx_ = heif_context_alloc();if (!heif_ctx_) return false;// 读取文件heif_error error = heif_context_read_from_file(heif_ctx_, filename.c_str(), nullptr);if (error.code != heif_error_Ok) return false;// 获取图片句柄(handle),这里,primary 可以理解为主图片。因为 heif 格式是支持将图片的原始图片(主图片)和不同等级的缩略图一起放在同一个文件里的。因此,如非需要,我们主要获取其主图片即可。再注意,这里传入的是指针的指针,即 heif_image_handle**heif_image_handle *heif_handle_ = nullptr;error = heif_context_get_primary_image_handle(heif_ctx_, &heif_handle_);if (error.code != heif_error_Ok) return false;// 获取图片宽高,注意,由于之前我们是获取的是主图片的句柄,因此这里获取的是当前句柄下图片的宽高width_ = heif_image_handle_get_width(heif_handle_);height_ = heif_image_handle_get_height(heif_handle_);// 解码,注意,这里需要再申请一个 heif_image 的指针变量,并将其地址传入该函数,即作为传出参数使用。// 此外,这里的 heif_colorspace_RGB 也可以用 heif_colorspace_YCbCr,// 同样地,后面的 heif_chroma_interleaved_RGBA 也可以用 heif_chroma_420 代替,// 来获取 YUV 420 的图像数据,可能解码效率上会快很多heif_image* heif_img_ = nullptr;error = heif_decode_image(heif_handle_, &heif_img_, heif_colorspace_RGB, heif_chroma_interleaved_RGBA, nullptr);if (error.code != heif_error_Ok) return false;int stride;// 解码完成之后,还需要调用下面的方法来获取解码数据的只读地址。拿到地址后如何使用,则看自己的了。// 我通常是直接 memcpy 到一个内存去使用,当然,也可以直接直接 glTexture2D 到 GPU 显存中去const uint8_t *data = heif_image_get_plane_readonly(heif_img_, heif_channel_interleaved, &stride);if (data == nullptr) return false;
}

对 libheif 相关环境变量内存的释放也很简单:

  if (heif_ctx_) {heif_context_free(heif_ctx_);heif_ctx_ = nullptr;}if (heif_handle_) {heif_image_handle_release(heif_handle_);heif_handle_ = nullptr;}if (heif_img_) {heif_image_release(heif_img_);heif_img_ = nullptr;}

【AVD】简述 C++ 解码 HEIF HEIC 图片相关推荐

  1. 如何让Fresco支持HEIF/HEIC图片格式

    一.阅前准备 HEIF图片格式是什么? 高效率图像格式(High Efficiency Image Format ,HEIF)最早被苹果公司的 iPhone 所使用,并且也将用于 Google 的 A ...

  2. Android与HEIF格式图片适配方法

    本文字数:1490字 预计阅读时间:8分钟 一. 什么是HEIF图片 HEIF (High Efficiency Image File Format)是由动态图像专家组(MPEG)在2013年推出的新 ...

  3. 嗨格式Heic图片转换器v1.0.13.1436官方版

    嗨格式Heic图片转换器是一款Heic图片格式转换工具,能够高效快速的进行图片格式转换,支持批量添加操作,极简轻松转换,软件支持heic/heif图片格式转换为jpg等格式. 软件特色: HEIC格式 ...

  4. asp.net 将bmp格式图片怎么转换为jpg_自媒体人都用它!HEIC图片转换器

    用苹果设备拍了N多素材,想导出到电脑上剪辑操作,却提示文件格式无法打开?是不是突然一头雾水,怎么还打开不了呢?那该怎么办呢? 别着急,跟着小奥做,包你解决问题! 为什么HEIC格式无法打开? HEIC ...

  5. android生成png图片,Android 中将 base64图片 解码为.png图片

    android 中将 "base64图片" 解码为".png"图片 参考: 方法一 String base64Img = ""; // 若包 ...

  6. asp.net 将bmp格式图片怎么转换为jpg_Heic图片转换精灵-Heic图片高清转换JPG/PNG/BMP方法...

    想打开heic文件,首先要做的是把图片格式转换成电脑可以查看的,电脑可以查看的形式也并非很单一,比如jpg/bmp/png,这些都是比较常用的格式,首先heic图片是苹果手机独有的图片格式,电脑上或者 ...

  7. heic图片如何在电脑上直接打开查看使用

    现在应该应该有很多电脑应该有了可以直接打开查看heic图片的查看器了,不过还是有些人的电脑不可以,如果想要打开使用heic图片,可以找支持heic格式的查看器,也可以将heic图片片转换成其他图片格式 ...

  8. 电脑使用图片转换器打开heic图片方法

    每一个苹果新用户似乎都会遇到一个共同的问题吗,那就是为什么拍出来的照片电脑和安卓手机都打不开,其实仔细看一下就知道了,苹果iOS11系统之后的默认图片都是heic格式,而安卓和电脑中都不支持这种格式, ...

  9. heif heic 的区别_什么是HEIF(或HEIC)图像格式?

    heif heic 的区别 The High Efficiency Image Format (HEIF) is used by Apple's iPhone and is also coming t ...

最新文章

  1. numpy 学习笔记
  2. java实现请求发送_java实现响应重定向发送post请求操作示例
  3. 外媒:社交媒体的大量使用与精神疾病有关
  4. C++:C++语言入门级基础知识考察点回顾之数组、指针
  5. 基于实时深度学习的推荐系统架构设计和技术演进
  6. mysql命令行执行复杂sql_mysql命令行中执行sql的几种方式总结
  7. oracle 容器运行_Oracle应用容器云的自由
  8. basler相机的触发线是那两脚_车牌相机是怎么和LED屏联动的?
  9. Exception in thread main java.lang.NoClassDefFoundError
  10. elementui树状菜单tree_Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)...
  11. 千万级测试String、StringBuffer和StringBuilder的速度
  12. 独家 | 一文读懂Adaboost
  13. AFNetWorking 之 网络请求的基本知识
  14. Eclipse Scout架构商业应用开发的工具与环境
  15. 系统学习NLP(二十八)--GPT
  16. mysql所选路径已经存在_5分钟安装好MySQL数据库(建议收藏)
  17. 【Java 8实战】Extension Methods
  18. 人教版,北师大版,北京版和苏教版的四年级数学知识点对比(附视频)
  19. FGFA训练自己的数据集docker
  20. 六个参数帮你全面了解固态硬盘

热门文章

  1. Google加速移动页面(AMP)简介
  2. 谷歌adsense作弊的方法
  3. Python Scipy 显著性检验
  4. android弱网模拟路由器,Mac 下使用命令行模拟弱网环境
  5. USB接口鼠标接触不良的简单处理
  6. 虚拟DOM 之 Snabbdom 一、基本介绍
  7. EMC文件服务器,emc存储服务器
  8. python中实时查看GPU状况 GPUtil
  9. RK3588 RGA 图像操作
  10. 淘宝/天猫获取sku详细信息 API 返回值说明