android 图片压缩 oom,android图片的压缩处理,防止出现OOM(out of memory)

适用场景:

你显示图片的ImageView的尺寸是100*100,但是你获取的图片资源的尺寸是1024*1024,如果直接把读取的Bitmap加载的话会无端消耗很多内存,因此可以对读取的Bitmap进行压缩处理。

处理方法:

android 中获取bitmap,我们通过操作BitmapFactory就可以实现,根据图片的来源不同有以下几种方法

(1)BitmapFactory.decordByteArray ------- Byte[ ]

(2)BitmapFactory.decodeFile-----------------File[ ]

(3)BitmapFactory.decodeStream------------InputStream

(4)BitmapFactory.decodeResource--------R.id.XXX

不加任何操作的话我们就直接把bitmap的原图读到了内存,如果图片过多多大的话就OOM了

因此在调用这些方法之前我们就要执行我们的压缩操作,通过把BitmapFactroy.options.injustDecodeBounds设为true,我们可以在不把图片加载到内存的情况下直接拿到图片的width和height,甚至MIME

BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

BitmapFactory.decodeResource(getResources(), R.id.myimage, options);

int imageHeight = options.outHeight;

int imageWidth = options.outWidth;

String imageType = options.outMimeType;

拿到了图片的bWidth和bHeight后,我们还需要知道ImageView的iWidth和iHeight,这样我们就可以计算压缩的比例了

public static int calculateInSampleSize(int bWidth,int bHeight,int iWidth,int iHeight){

int inSampleSize = 1;

if (bWidth > iWidth || bHeight > iHeight) {

inSampleSize = Math.min(bWidth/iWidth, bHeight/iHeight);

}

return inSampleSize;

}

计算得到比例以后,设置BitmapFactory.option.inSampleSize,然后记得把BitmapFactory.option.inJustDecdeBounds设置为false,之后就可以读取我们压缩过之后的Bitmap了

options.inSampleSize = mInSampleSize;

options.inJustDecodeBounds = false;

Bitmap bm = BitmapFactory.decodeResource(getResource(),R.id.myimage,options);OK,大功告成

注:图片加载的优化还可以使用内存缓存和硬盘缓存策略,硬盘缓存策略避免了频繁的网络下载操作,内存缓存避免了频繁的读取操作,使用LruCache,二者结合使用会取得不错的结果。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值