【AVD】简述 C++ 解码 HEIF HEIC 图片
随着软硬件技术的不断升级,相机像素越来越高、人们对照片细节的要求越来越多,高压缩率、低损失率的编码格式,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 图片相关推荐
- 如何让Fresco支持HEIF/HEIC图片格式
一.阅前准备 HEIF图片格式是什么? 高效率图像格式(High Efficiency Image Format ,HEIF)最早被苹果公司的 iPhone 所使用,并且也将用于 Google 的 A ...
- Android与HEIF格式图片适配方法
本文字数:1490字 预计阅读时间:8分钟 一. 什么是HEIF图片 HEIF (High Efficiency Image File Format)是由动态图像专家组(MPEG)在2013年推出的新 ...
- 嗨格式Heic图片转换器v1.0.13.1436官方版
嗨格式Heic图片转换器是一款Heic图片格式转换工具,能够高效快速的进行图片格式转换,支持批量添加操作,极简轻松转换,软件支持heic/heif图片格式转换为jpg等格式. 软件特色: HEIC格式 ...
- asp.net 将bmp格式图片怎么转换为jpg_自媒体人都用它!HEIC图片转换器
用苹果设备拍了N多素材,想导出到电脑上剪辑操作,却提示文件格式无法打开?是不是突然一头雾水,怎么还打开不了呢?那该怎么办呢? 别着急,跟着小奥做,包你解决问题! 为什么HEIC格式无法打开? HEIC ...
- android生成png图片,Android 中将 base64图片 解码为.png图片
android 中将 "base64图片" 解码为".png"图片 参考: 方法一 String base64Img = ""; // 若包 ...
- asp.net 将bmp格式图片怎么转换为jpg_Heic图片转换精灵-Heic图片高清转换JPG/PNG/BMP方法...
想打开heic文件,首先要做的是把图片格式转换成电脑可以查看的,电脑可以查看的形式也并非很单一,比如jpg/bmp/png,这些都是比较常用的格式,首先heic图片是苹果手机独有的图片格式,电脑上或者 ...
- heic图片如何在电脑上直接打开查看使用
现在应该应该有很多电脑应该有了可以直接打开查看heic图片的查看器了,不过还是有些人的电脑不可以,如果想要打开使用heic图片,可以找支持heic格式的查看器,也可以将heic图片片转换成其他图片格式 ...
- 电脑使用图片转换器打开heic图片方法
每一个苹果新用户似乎都会遇到一个共同的问题吗,那就是为什么拍出来的照片电脑和安卓手机都打不开,其实仔细看一下就知道了,苹果iOS11系统之后的默认图片都是heic格式,而安卓和电脑中都不支持这种格式, ...
- heif heic 的区别_什么是HEIF(或HEIC)图像格式?
heif heic 的区别 The High Efficiency Image Format (HEIF) is used by Apple's iPhone and is also coming t ...
最新文章
- numpy 学习笔记
- java实现请求发送_java实现响应重定向发送post请求操作示例
- 外媒:社交媒体的大量使用与精神疾病有关
- C++:C++语言入门级基础知识考察点回顾之数组、指针
- 基于实时深度学习的推荐系统架构设计和技术演进
- mysql命令行执行复杂sql_mysql命令行中执行sql的几种方式总结
- oracle 容器运行_Oracle应用容器云的自由
- basler相机的触发线是那两脚_车牌相机是怎么和LED屏联动的?
- Exception in thread main java.lang.NoClassDefFoundError
- elementui树状菜单tree_Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)...
- 千万级测试String、StringBuffer和StringBuilder的速度
- 独家 | 一文读懂Adaboost
- AFNetWorking 之 网络请求的基本知识
- Eclipse Scout架构商业应用开发的工具与环境
- 系统学习NLP(二十八)--GPT
- mysql所选路径已经存在_5分钟安装好MySQL数据库(建议收藏)
- 【Java 8实战】Extension Methods
- 人教版,北师大版,北京版和苏教版的四年级数学知识点对比(附视频)
- FGFA训练自己的数据集docker
- 六个参数帮你全面了解固态硬盘