Android修行手册-基础优化系列图片篇-下

2,294 阅读4分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。

👉关于作者

众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)

欢迎关注公众号【空名先生】获取更多资源和交流!

👉前提

前面小空坚持写的Android新手向系列,欢迎品尝。

在前面文章中我们学习了布局优化内容,今天我们再说一说图片优化的快哉江湖!!!

承接上一篇。

👉实践过程

首先推荐给大家一个压缩网站tinypng.com/

一般做过图片优化的可能都知道这个网站,毕竟一搜索这家伙就排在搜索引擎第一位,但Android开发新手可能没了解过。

这个网站压缩图片非常非常的棒,它压缩的是原始文件,压缩后即使你放大,从视觉上基本也看不出什么差别,屌爆了,OMG的,用它。

我已经养成习惯,用图片前一般都会压缩。它是有客户端的,界面如下。

image.png

接着回到我们Android技术,官方有个BitmapFactory类,提供了很多解析方法

image.png decodeStream方法一般出来从网络过来的图片,

decodeFile方法可以搞sd卡里面的图片

decodeResource方法处理资源文件里面的图片。

这些方法会为创建的Bitmap分配内存,如果图片过大的话就会导致 OOM。

看上面图片的注释BitmapFactory.Options提供了一个参数inSampleSize,可以帮助实现压缩。

看个例子:

假设我们有个6666*6666辣么大的图,设置了inSampleSize为6,那么加载到内存中的就是1111*1111像素的图,宽高各是原来的1/6,那所占用的空间理论上应该是1/36。

注意:inSampleSize的值需要是2的倍数,小于1则默认为1,如果是奇数则默认减1

实现尺寸压缩:

image.png

质量压缩无法避免oom,但可以改变图片在磁盘中或者说是File文件的大小,尺寸压缩可以避免OOM,但不改变图片本身的大小,只改变加载是在内存中的大小,即bitmap。  

讲完整体压缩,我们再来介绍另一个场景:手机一屏显示不小的超大图!!

比如:3840*2160的高清壁纸。

上面的压缩方案肯定导致图看不清,体验极差。

所以我们就得采用局部显示来展示图片。

Android为我们提供了一个类:BitmapRegionDecoder来局部展示图片的,它能后实现展示图片的指定区域。

  1. BitmapRegionDecoder提供了一系列的newInstance来进行初始化,支持传入文件路径,文件描述符和文件流InputStream等

  2. 之后借助decodeRegion方法来指定显示的区域。

  3. 最后再加上一些手势操作即可。

文章鸿洋大神已经有教程了,在此不赘述。

具体可参考 :blog.csdn.net/lmj62356579…

😜其他

还有一个实际方案,单位有这样一个场景:教学内容,里面一般是固定内容,就像说明书一样,样式花红柳绿的,靠写布局代码那可不划算,所以直接就用图片展示就行了。

这图片可就大了,虽然宽度一般是1080,但是高度可能高达50000像素,这要直接显示不得炸了? 所以直接将这个大图切割成若干个1080*600图片,然后用RecyclerView实现。Item直接一个ImageView即可。省事的很;

😜总结:

  1. 当图片加载进内存时,会经过分辨率转换,进而计算大小,影响因素就在于设备DPI和不同密度的dpi资源文件夹。所以图片一定要放在对应的drawable下

  2. 在使用图片之前先从根上对图片做一次无损压缩。

  3. 上面两情况基本解决大部分场景,再适配的话接着考虑尺寸压缩/质量压缩

  4. 针对巨屌图,看业务场景来选择局部显示方案还是直接切图多个图片方案。

👉其他

📢作者:小空和小芝中的小空

📢转载说明-务必注明来源:芝麻粒儿 的个人主页 - 专栏 - 掘金 (juejin.cn)

📢欢迎点赞👍收藏🌟留言📝