Bitmap inSampleSize 缩放

2018/07/16 Blog

一、本文需要解决的问题

线上发现一个 OOM,是读取相册图片之后,通过 base64返回给 h5,因为目前带项目事情比较多,交给组内一个大龄同事处理。 过了半天左右,看到他提交的代码,里面写的是如果图片像素是屏幕16倍,则缩放因子是4,如果是9倍则缩放因子是3,,2,,1。看到这一坨代码,我着实害怕,虽然他说这是以前的项目就是这么干的。

作为一个多年工作的程序员,能不写死就不写死,防御性编程。上面这种做法完全就是 it works,但是 no why。而且他说虽然谷歌官网上说 inSampleSize 写的是2的 k 次方,实际上传几倍就是几分之一,然后说还用 demo 验证了下。

于是我就看了他写的 demo,debug 验证他说的 inSampleSize,貌似3,图片长宽真的缩放到1/3。看起来 work 了,但是并不能说服我。

  1. glide 等官方库都有做图片压缩,防止 OOM,都是以2的 k 次方为目标
  2. google 官网文档也有 example,也是2的 k 次方
  3. 我们用了很久的自研网络图片库也是2的 k 次方

所以,趁着下班时间,我写了同样的 demo,发现

  • 4.4 缩放到2的 k 次方
  • 5.0 缩放到2的 k 次方
  • 6.0 无手机测试
  • 7.0 给多少倍,是多少倍

所以证明这只是 google 在7.0新系统上 api 有所差异,不能以偏概全。

虽然直接用缩放比例,在7.0以后的系统上的确效果更好,但是还是要注意兼容以前的系统。 不能写死16,9倍之类的东西,永远记住:看起来不可能发生的事情,早晚要发生。

结论

用官方 example 来做缩放

总结

虽然我到目前只有三年的工作经验,但是我觉得一个事情,要搞清楚来龙去脉,不能写个 demo,就说是这样,而且连 google 官方文档、著名开源库,业界统一规范也不相信。

本文只是记录一下,趁着自己还有时间深入捣鼓,多写写,也算是经验分享吧。

Search

    Table of Contents