8

对于 c++ 项目,我需要打开并显示 HEIF (.heic) 图像。我所知道的(如果我是对的)是 HEIF 图像基于 ffmpeg 标准,并且需要读取 H265 编解码器。

我找到了几个开源 H265 编解码器:

我可以打开并显示每个 H265 编码的视频文件,但我无法简单地打开、显示或转换 .heic 图像。它们都返回错误,或者什么都不做。

老实说,我有点困惑,因为 HEIF 标准似乎是一个保守的秘密。我找不到可以让我找到解决方案的相关信息。我发现的只是技巧和变通方法,例如强制设备(我在这里谈论的是使用新 iOS11 的 Apple iPhone)生成 jpg 图像而不是 heic,或使用第三方应用程序(如 dr.fone)。当然,这些解决方案对我来说无关紧要。

那么,有人可以告诉我应该对 .heif 图像使用哪种编解码器,以及如何使用它来打开它?或者是否有允许操作这种类型的图像文件的开源库或示例?有人可以指出我的好方向吗?

4

2 回答 2

3

诺基亚 HEIF 专用查看器示例可在此处获得。我还直接使用 FFmpeg 进行了测试,它能够打开(播放/解压缩)提供的一致性文件

于 2017-09-13T12:40:57.270 回答
3

libheif似乎是一个非常活跃的 HEIF LGPL库,带有 C API。从自述文件:

该库有一个 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 的演示可用,它实际上允许您直接在浏览器中加载和查看 HEIF 文件。

于 2019-02-08T15:20:28.020 回答