对于c ++项目,我需要打开并显示HEIF(.heic)图像。我所知道的(如果我是对的)是HEIF图像基于ffmpeg标准,并且需要读取H265编解码器。
我找到了几个开源的H265编解码器:
我可以打开并显示每个H265编码的视频文件,但我无法简单地打开,显示或转换.heic图像。所有这些都会返回错误,或者什么都不做。
说实话,我有点困惑,因为HEIF标准似乎是一个保密的秘密。我无法找到可以让我走到解决方案的相关信息。我找到的只是技巧和解决方法,例如强迫设备(我在这里讲的是关于使用新iOS11的Apple iPhone)生成jpg图像而不是heic,或使用像dr.fone这样的第三方应用程序。当然,这些解决方案对我来说无关紧要。
那么,有人可以告诉我应该使用哪个编解码器和.heif图像,以及如何使用它来打开它?或者是否有开源库或允许操作此类图像文件的示例?有人可以指出我的好方向吗?
可以从here获得特定于来自诺基亚的HEIF的示例查看器。我还直接用FFmpeg测试,它能够打开(播放/解压缩)提供的conformance files。
libheif似乎是一个非常活跃的用于HEIF的LGPL库,带有C API。来自README:
该库具有C API,可轻松集成并提供广泛的语言支持。请注意,API仍在进行中,可能仍会发生变化。
将主映像加载到HEIF文件中就像这样简单:
heif_context* ctx = heif_context_alloc(); heif_context_read_from_file(ctx, input_filename, nullptr); // get a handle to the primary image heif_image_handle* handle; heif_context_get_primary_image_handle(ctx, &handle); // decode the image and convert colorspace to RGB, saved as 24bit interleaved heif_image* img; heif_decode_image(handle, &img, heif_colorspace_RGB, heif_chroma_interleaved_24bit, nullptr); int stride; const uint8_t* data = heif_pixel_image_get_plane_readonly(img, heif_channel_interleaved, &stride);
一个很好的,Emscripten驱动的demo可用,它实际上允许您直接在浏览器中加载和查看HEIF文件。