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; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。