HEIF 图片处理

搭载 Android 10 的设备支持 HEIC 压缩图片格式,它是 ISO/IEC 23008-12 中规定的高效图片文件格式 (HEIF) 的高效视频编码 (HEVC) 特定品牌。与 JPEG 文件相比,HEIC 编码的图片质量更好且文件更小。

HEIC 图片由摄像头传输框架生成,请求来自相机 HAL 的未压缩图片并将其发送到媒体子系统,以便由 HEIC 或 HEVC 编码器进行编码。

要求

要支持 HEIC 图片格式,您的设备必须拥有支持 MIMETYPE_IMAGE_ANDROID_HEICMIMETYPE_VIDEO_HEVC(具有恒定质量模式)的硬件编码器。

实现

要在您的设备上支持 HEIC 图片格式,请实现 HEIC/HEVC 编解码器,并为所需的流配置(即 IMPLEMENTATION_DEFINED/YUV 流和 JPEG 应用细分流)提供支持。

媒体

对于相应的硬件,以恒定质量 (CQ) 模式实现 HEIC/HEVC 编解码器,如下所示:

  • HEVC 类型编解码器使用具有 GRALLOC_USAGE_HW_VIDEO_ENCODER 用法的 IMPLEMENTATION_DEFINED 格式或 HAL_PIXEL_FORMAT_YCBCR_420_888 格式,具体取决于图片大小。
  • HEIC 类型编解码器使用具有 GRALLOC_USAGE_HW_IMAGE_ENCODER 用法的 IMPLEMENTATION_DEFINED 格式。

摄像头

在静态元数据中,将 ANDROID_HEIC_INFO_SUPPORTED 设置为 true,并将 ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT 设置为介于 [1, 16] 之间的值,以表明 JPEG 应用细分的数量。

对于每个必要的流组合,您的摄像头设备必须支持使用相同大小的 HEIC 流替换 JPEG 流。

对于公共 API 上的 HEIC 输出流,摄像头服务会创建两个 HAL 内部流:

  • 具有 JPEG_APPS_SEGMENT 使用标记的 BLOB 流,可存储应用细分(包括 EXIF 和缩略图细分)
  • IMPLEMENTATION_DEFINEDYCBCR_420_888 会根据目标编解码器和 HEIC 流的大小流式传输 HEIC 流的大小

摄像头传输框架根据 ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT 为相机 HAL 分配足够大的缓冲区,以便填充 JPEG 应用细分。APP1 细分为必填项,但 APP1 之后(APP2 及以上)的细分为可选项。摄像头传输框架可以覆盖 APP1 细分中的 EXIF 标记(这些标记可以派生自捕获结果元数据或者与主图片比特流相关),并将它们发送至 MediaMuxer

由于媒体编码器将屏幕方向嵌入到了输出图片的元数据中,以确保主图片和缩略图的屏幕方向一致,因此相机 HAL 不得根据 android.jpeg.orientation. 旋转缩略图。 该框架将屏幕方向写入到 EXIF 元数据和 HEIC 容器中。

与 JPEG 格式相关的静态、控制和动态元数据标记也适用于 HEIC 格式。例如,捕获请求中的 android.jpeg.orientationandroid.jpeg.quality 元数据标记用于控制 HEIC 图片的屏幕方向和质量。

要在应用中使用 HEIC 格式,请使用 HEIC 公共 API

如需了解详情,请参阅以下来源。

相机 HAL

  • docs.html
  • CameraBlob
  • ANDROID_HEIC_INFO_SUPPORTED
  • ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT

图形缓冲区数据空间

  • JPEG_APP_SEGMENTS
  • HEIF

图形缓冲区使用空间

  • HW_IMAGE_ENCODER

验证

要验证您的实现是否支持 HEIC 图片,请使用 TestingCamera2 测试应用,并运行以下摄像头 CTS 和 VTS 测试。

摄像头 CTS 测试

摄像头 VTS 测试