Android与HEIF格式图片适配方法

本文介绍了HEIF图片格式,一种由MPEG于2013年推出的高压缩比格式,尤其在苹果设备中广泛应用。针对Android平台,文章详细探讨了HEIF的优缺点,并提供了三种技术实现方案:1) 使用Android P新增的ImageDecoder;2) 利用BitmapFactory;3) 将HEIF转换为JPEG。同时,建议采用系统图片扫描而非应用自身扫描以提高兼容性。文章指出,虽然HEIF有良好前景,但因硬件和专利问题,Android设备的普及仍面临挑战。
部署运行你感兴趣的模型镜像

36778d68a2e56367499eedd10790e1c7.png

 26a955fba90519d38eae4e678e674eb0.gif 

本文字数:1490

预计阅读时间:8分钟

一. 什么是HEIF图片

HEIF (High Efficiency Image File Format)是由动态图像专家组(MPEG)在2013年推出的新格式。

苹果在iOS11系统中引入HEIF格式用于替代原来的JPG格式的图片。使用HEVC的编码技术存储图像数据,进一步减少存储容量和提升图像质量。Android P开始原生支持HEIF格式。

HEIF相较于JPEG格式,拥有高压缩比、图片集合功能、支持动态图片和图片派生等优势。 另外,我们对市场上近2000款应用进行了测试,90%以上的应用已经能支持HEIF图片查看等功能。

6c2a799ee6dc8bbcc1df0430f389ab29.png

二. HEIF图片价值

  1. 与 JPEG 同等图片质量的压缩率是 JPEG 的2.39倍,可节省约50%空间,节省网络传输流量。

  2. 支持存储多张图片(图片集合、序列图等,如连拍)。

  3. 支持动态图片(类似 Gif 动图)。

  4. 支持图片深度信息、透明度信息。

三. 主要图片格式对比

37f05f5106df759f3ee2541dcadd48e2.png

优点:

  • 压缩比高,在相同的图片质量情况下,平比 JPEG 高两倍。

  • 能增加如图片深度信息,透明通道等辅助图片。(苹果正是通过这个就能实现动态的调整图片的景深)。

  • 支持存放多张图片,类似相册和集合。(实现多重曝光的效果)。

  • 支持多张图片实现 GIF 和 livePhoto 的动画效果。

  • 无类似 JPEG 的最大像素限制。

  • 支持缩略图。

  • 支持透明像素。

  • 分块加载机制。

缺点:

应用不广泛,兼容性不好,平台应用都要支持适配,产业链条长。

‍‍‍四. 技术实现方案‍‍‍

1. 谷歌未提供统一接口

推荐应用通过手机系统版本来判断是否支持 HEIF 格式编解码。目前,Android O 版本 MR支持 HEIF 静态图的软件解码,Android P 支持 HEIF 软件解码、软件编码。

以华为 Android P 版本手机 HEIF 格式编解码为例。

方法一:通过 Android P 版本新增的类 ImageDecoder 加载图片。

参考实现代码:

59e98e2b4eec96f1e3c5be502972b670.png

方法二:通过历史版本已有类 BitmapFactory 加载图片。

该方法工作量最小,只需放开 Android P 版本手机 HEIF 图片文件加载,无需修改图片加载代码。需要注意的是,应用需默认支持 HEIF 图片的加载查看。

参考实现代码:

f64e8f7732556b6178a4cd06ef60191c.png

方法三:HEIF 格式转 JPEG

使用场景:HEIF 格式转成JPEG格式主要考虑向下兼容的问题。通过支持HEIF格式的手机向不支持此格式的手机发送HEIF图片,如果直接发送原始HEIF格式,会出现图片无法使用的情况。

因此,为了避免这种情况,可以考虑在发送之前将HEIF格式图片转换成JPEG格式再发送。应用可以选择使用谷歌原生的接口来进行转换。

先判断图片是否为.HEIF 类型。

参考实现代码:

d8d18e3605e4bb1b1444fe903ae5a652.png

将HEIF 格式转 JPEG。
  • 使用BitmapFactory解码图片,解码后将得到RGB的图像

  • 使用Bitmap的compress()方法,来进行图片的压缩

  • 其中quality代表图片质量参数,范围为1-100,数值越高图片清晰度越高,图片size越大,建议为95。

参考实现代码:

129bd8e61b714a8973f6aa0baf6be0e1.png

获取新生成的图片进行接下来的操作处理。

参考实现代码:

648a69b4e32ee8903aee6de9970a1cbb.png

测试了HEIFJPEG效率,在Android P pixel XL上用bitmapfactory的方式试了下,resolution 1440x960 quality 95, 耗时在200ms左右,不同的机型CPU等效果是不一样的这个后边再次统计下,现在市面上Android P的手机太少,目前看来还是比较快的。

2.图片扫描推荐方式

方式一(推荐):

通过ContentProvider扫描,实现本地图片的上传、分享或者是发送功能,需要扫描手机本地的图片。

如果应用通过自身扫描的方式,需根据手机版本判断手机支持的图片编解码格式,所以推荐使用ContentProvider 扫描手机中的图片。通过这种方法扫描,系统会将支持的所有解码格式的图片文件返回给应用,不需要应用自身再去做格式判断。

参考实现代码:

8c3e9bcc03b3d3955917bf1b84163e55.png

方式二(不推荐):应用自身进行扫描。

应用通过自身扫描,判断哪些是可支持的图片文件,需要增加对HEIF格式的判断, HEIF 格式文件的后缀有两种:.heif.heic

五. 前景

并不是每一部手机都将支持这个功能。不支持的原因是硬件配置与专利许可的限制。要使用该技术,手机厂商需要要先支付一大笔专利费用。 这两个问题对苹果来说都不难解决。但是安卓手机来自不同的厂商,搭载了不同规格的硬件。因此,HEIF图片格式难以安装到安卓手机上。

一位业内人士提到了一个重要原因:HEIF图片需要借高效视频编码HEVC来实现。因此,手机处理器需要支持HEVC技术,才能处理HEIF图片。目前,支持HEVC技术的处理器有高通的新旗舰骁龙845,以及810、820、835等。联发科的高端产品Helio X系列处理器大部分也支持HEVC,但Helio X10和较低端的Helio P系列处理器则不支持。三星的Exynos 7和Exynos 9系列处理器均支持HEVC

六. 心得体会

HEIF图片格式的诸多优势使它具有很好的市场前景,这次谷歌Android P本对此格式的支持也充分说明了这一点,建议各位广大开发者赶紧适配。

参考:

华为技术文档

引用:

https://blog.youkuaiyun.com/lin20044140410/article/details/88577790 94d7-87af49a57e76.png)

d13ebcbd9dbd59cd765415ad10eebb80.gif

309d311bfa442fbd18fb3aacf9bb6858.png

也许你还想看

(▼点击文章标题或封面查看)

Android自定义ViewGroup的那些事儿

2021-10-14

e53fd893bb82b34be35ac0d421dc46ea.png

SwiftUI的NavigationView的基础讲解与进阶实践

2021-11-25

49be94d5ec102f1364d0e747b1e0f5e3.png

KVO原理分析介绍

2021-11-18

c1bdb384f1be12e0ddbfda491f59028b.png

iOS下的闭包上篇-Block

2021-11-04

e00996f7f465625532d0c474fe4d0ab4.png

Flutter之美

2021-10-28

a319b6bcab976dfe4ef2d33a714721e8.png

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值