android bitmap 无损压缩,详解Bitmap尺寸压缩与质量压缩

转载请注明出自flowsky37的博客,尊重他人辛苦劳动!

在Android系统中,关于图片处理的是一个既常见又比较棘手的问题。一个应用中,存在需要展示大量的图片的布局,那我们必须要小心翼翼的处理了,不然OOM会就像一个定时炸弹一样出现。由于大量位图加载导致的内存溢出是Android中内存溢出常见场景之一。关于图片的处理,一般情况下就是要对bitmap进行合适的处理跟优化。

在Android应用中,图片的主要存在方式:

以File的形式存在于SD卡中

以Stream的形式存在于内存中

以Bitmap形式存在于内存中

在SD卡中图片占用的内存与以Stream形式大小一样,均小于Bitmap形式下内存占比。既当图片从SD卡中以流的形式加载到内存中时大小是不会发生变化的,但是stream转化为Bitmap时,其大小会突然变大。这也是为什么当需要加载大量图片时容易出现OOM的主要原因。

BitmapFactory提供了4类方法加载Bitmap对象:

1. decodeFile 从文件中加载Bitmap对象

2. decodeResource 从资源中加载Bitmap对象

3. decodeStream 从输入流中加载Bitmap对象

4. decodeByteArray 从字节数组中加载Bitmap对象

其中decodeFile和decodeResource间接的调用了decodeStream方法。

为什么转化为Bitmap时大小会突然变大呢?

以任意一张图片为例,我本地存了一张分辨率为750*1334,大小为119K。如果将这张图片以bitmap形式加载到内存中,它占用的大小是多少,如何计算呢?它的计算公式:

图片的占用内存 = 图片的长度(像素单位) * 图片的宽度(像素单位) * 单位像素所占字节数

其中单位占用字节数的大小是变化的,由BitmapFactory.Options的inPreferredConfig

决定,为Bitmap.Config类型,一般情况下默认为:ARGB_8888。不同类型占字节大小如下表所示:

dce07ba1162c2cba4373df0517c9a5cd.png

可以计算出此图片以bitmap形式加载消耗内存为:750*1334*4=3.81M,还是由于我测试的图片任意找的一张图,现

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值