如何打开HEIF (.heic) 图片?

9
对于一个C++项目,我需要打开并显示一个HEIF (.heic) 图像。据我所知(如果我没错的话),HEIF图像基于ffmpeg标准,并需要H265编解码器才能读取。
我找到了几个开源的H265编解码器:
- OpenHEVC (https://github.com/OpenHEVC/openHEVC) - x265 (https://bitbucket.org/multicoreware/x265/downloads/) - libde265 (https://github.com/strukturag/libde265)
我可以使用它们中的任何一个打开和显示H265编码的视频文件,但我无法简单地打开、显示或转换.heic图像。它们都返回错误或什么也不做。
老实说,我有点困惑,因为HEIF标准似乎是一个保密的秘密。我找不到相关信息,可以让我走向解决方案。我找到的都是一些技巧和解决方法,比如强制设备(我在这里说的是使用新iOS11的苹果iPhone)生成jpg图像而不是heic,或者使用第三方应用程序,比如dr.fone。当然,这些解决方案对我来说都不相关。
所以,有人可以告诉我应该使用哪个编解码器来处理.heif图像,以及如何使用它来打开它吗?或者有没有开源库或示例可以操作这种类型的图像文件?有人可以指点我正确的方向吗?

FFMPEG仍然不支持HEIF格式。已经有一个错误报告来处理这个问题。https://trac.ffmpeg.org/ticket/6521 这应该是一个评论而不是回复,但我没有权限进行评论。 - avibrazil
1
关于FFMPEG与HEIC图片的兼容性问题,有好消息了吗? - bgcode
1
就我而言,我最终使用了libde265库(http://www.libde265.org/)获得了结果。然而,它的功能受到了很大的限制:在我所有的样本中,我只能打开这个视频:https://github.com/strukturag/libde265.js/blob/master/demo/spreedmovie.hevc。我不知道是否有任何FFMPEG库现在正确支持HEIV/HEVC格式。我所知道的是,我的公司找到了一种方法来做到这一点,使用我们内部SDK的几个来读取HEIV/HEVC媒体内容并将其发送到FFMPEG解码器,其中之一是Windows插件,可以在这里下载:https://www.copytrans.net/download/。 - Jean-Milost Reymond
2个回答

4

libheif似乎是一个相当活跃的LGPL库,用于HEIF,带有C API。从README中可以看到:

The library has a C API for easy integration and wide language support. Note that the API is still work in progress and may still change.

The decoder automatically supports both HEIF and AVIF through the same API. No changes are required to existing code to support AVIF. The encoder can be switched between HEIF and AVIF simply by setting heif_compression_HEVC or heif_compression_AV1 to heif_context_get_encoder_for_format().

Loading the primary image in an HEIF file is as easy as this:

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_RGB, nullptr);

int stride;
const uint8_t* data = heif_image_get_plane_readonly(img, heif_channel_interleaved, &stride);

有一个使用 Emscripten 技术的不错的演示可以直接在浏览器中加载和查看 HEIF 文件。


3
感谢您分享这些信息。如果我在解决这个问题时有这样的一个库可用,我很可能会使用它,但不幸的是在我的情况下,我已经实现了自己的库。但知道现在有一个开源的替代品是一件好事。 - Jean-Milost Reymond
heif_pixel_image_get_plane_readonly() 方法已经被弃用了吗?我这里显示为未定义。 - ihsan
看起来已经改成了 heif_image_get_plane_readonly()(没有 _pixel)。我已经更新了自己的 README 摘录。 - mwfearnley
嘿,我无法正确安装libheif。在使用cmake时,我该如何添加libde265?如果没有它,heif_decode_image()将返回不支持的编解码器。在使用cmake构建时,我该如何设置libde265与libheif配合工作? - ihsan

3

Nokia提供了一个专门用于HEIF的示例查看器,可以在这里找到。我也直接使用FFmpeg进行测试,它能够打开(播放/解压缩)提供的一致性文件


1
感谢提供的链接,我将使用符合性文件进行新的测试。对于诺基亚SDK,我已经尝试过使用它,但没有成功,而且该产品非常严格的许可证使我不愿进一步推进我的研究。无论如何,这只是一个解析器,允许打开.heic文件并将其流传输到编解码器,或者我错了吗? - Jean-Milost Reymond
那么,现在的问题可能是:“如何将这样的流传输到编解码器”。首先,我可以使用哪种编解码器?(当然,答案的一部分应该在符合性文件中,我会尽快进行测试) - Jean-Milost Reymond
1
你的意思是在使用诺基亚的SDK时吗?我想他们可能希望你使用hm来完成,但这显然取决于你,任何解码器(甚至是FFmpeg或de265)都可以胜任。 - Ronald S. Bultje

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接