Android 图片处理避免出现oom的方法详解
1.通过设置采样率压缩
res资源图片压缩decodeResource
publicBitmapdecodeSampledBitmapFromResource(Resourcesres,intresId,intreqWidth,intreqHeight){
//FirstdecodewithinJustDecodeBounds=truetocheckdimensions
finalBitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inJustDecodeBounds=true;
BitmapFactory.decodeResource(res,resId,options);
//CalculateinSampleSize
options.inSampleSize=calculateInSampleSize(options,reqWidth,reqHeight);
//DecodebitmapwithinSampleSizeset
options.inJustDecodeBounds=false;
returnBitmapFactory.decodeResource(res,resId,options);
}
uri图片压缩decodeStream
publicBitmapdecodeSampledBitmapFromUri(Uriuri,intreqWidth,intreqHeight){
Bitmapbitmap=null;
try{
BitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inJustDecodeBounds=true;
BitmapFactory.decodeStream(getContentResolver().openInputStream(uri),null,options);
options.inSampleSize=BitmapUtils.calculateInSampleSize(options,
UtilUnitConversion.dip2px(MyApplication.mContext,reqWidth),UtilUnitConversion.dip2px(MyApplication.mContext,reqHeight));
options.inJustDecodeBounds=false;
bitmap=BitmapFactory.decodeStream(getContentResolver().openInputStream(uri),null,options);
}catch(Exceptione){
e.printStackTrace();
}
returnbitmap;
}
本地Fileurl图片压缩
publicstaticBitmapgetloadlBitmap(Stringload_url,intwidth,intheight){
Bitmapbitmap=null;
if(!UtilText.isEmpty(load_url)){
Filefile=newFile(load_url);
if(file.exists()){
FileInputStreamfs=null;
try{
fs=newFileInputStream(file);
}catch(FileNotFoundExceptione){
e.printStackTrace();
}
if(null!=fs){
try{
BitmapFactory.Optionsopts=newBitmapFactory.Options();
opts.inJustDecodeBounds=true;
BitmapFactory.decodeFileDescriptor(fs.getFD(),null,opts);
opts.inDither=false;
opts.inPurgeable=true;
opts.inInputShareable=true;
opts.inTempStorage=newbyte[32*1024];
opts.inSampleSize=BitmapUtils.calculateInSampleSize(opts,
UtilUnitConversion.dip2px(MyApplication.mContext,width),UtilUnitConversion.dip2px(MyApplication.mContext,height));
opts.inJustDecodeBounds=false;
bitmap=BitmapFactory.decodeFileDescriptor(fs.getFD(),
null,opts);
}catch(IOExceptione){
e.printStackTrace();
}finally{
if(null!=fs){
try{
fs.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
}
}
returnbitmap;
}
根据显示的图片大小进行SampleSize的计算
publicintcalculateInSampleSize(BitmapFactory.Optionsoptions,intreqWidth,intreqHeight){
if(reqWidth==0||reqHeight==0){
return1;
}
//Rawheightandwidthofimage
finalintheight=options.outHeight;
finalintwidth=options.outWidth;
intinSampleSize=1;
if(height>reqHeight||width>reqWidth){
finalinthalfHeight=height/2;
finalinthalfWidth=width/2;
//CalculatethelargestinSampleSizevaluethatisapowerof2and
//keepsbothheightandwidthlargerthantherequestedheightandwidth.
while((halfHeight/inSampleSize)>=reqHeight&&(halfWidth/inSampleSize)>=reqWidth){
inSampleSize*=2;
}
}
returninSampleSize;
}
调用方式:
mImageView.setImageBitmap(decodeSampledBitmapFromResource(getResources(),R.id.myImage,100,100))
Bitmapbitmap=decodeSampledBitmapFromUri(cropFileUri);
UtilBitmap.setImageBitmap(mContext,mImage, UtilBitmap.getloadlBitmap(url,100,100), R.drawable.ic_login_head,true);
2.质量压缩:指定图片缩小到xkb以下
//压缩到100kb以下
intmaxSize=100*1024;
publicstaticBitmapgetBitmapByte(BitmaporiBitmap,intmaxSize){
ByteArrayOutputStreamout=newByteArrayOutputStream();
oriBitmap.compress(Bitmap.CompressFormat.JPEG,100,out);
byte[]fileBytes=out.toByteArray();
intbe=(maxSize*100)/fileBytes.length;
if(be>100){
be=100;
}
out.reset();
oriBitmap.compress(Bitmap.CompressFormat.JPEG,be,out);
returnoriBitmap;
}
3.单纯获取图片宽高避免oom的办法
itmapFactory.Options这个类,有一个字段叫做inJustDecodeBounds。SDK中对这个成员的说明是这样的:
Ifsettotrue,thedecoderwillreturnnull(nobitmap),buttheout...
也就是说,如果我们把它设为true,那么BitmapFactory.decodeFile(Stringpath,Optionsopt)并不会真的返回一个Bitmap给你,它仅仅会把它的宽,高取回来给你,这样就不会占用太多的内存,也就不会那么频繁的发生OOM了。
/**
*根据res获取Options,来获取宽高outWidth和options.outHeight
*@paramres
*@paramresId
*@return
*/
publicstaticBitmapFactory.OptionsdecodeOptionsFromResource(Resourcesres,intresId){
//FirstdecodewithinJustDecodeBounds=truetocheckdimensions
finalBitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inJustDecodeBounds=true;
BitmapFactory.decodeResource(res,resId,options);
returnoptions;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。