android 将图片压缩到指定的大小的示例
从网上收集后自己写的一个方法;
1.首先是一个根据分辨率压缩的类,首先对图片进行一次压缩
/** *根据分辨率压缩图片比例 * *@paramimgPath *@paramw *@paramh *@return */ privatestaticBitmapcompressByResolution(StringimgPath,intw,inth){ BitmapFactory.Optionsopts=newBitmapFactory.Options(); opts.inJustDecodeBounds=true; BitmapFactory.decodeFile(imgPath,opts); intwidth=opts.outWidth; intheight=opts.outHeight; intwidthScale=width/w; intheightScale=height/h; intscale; if(widthScale<heightScale){//保留压缩比例小的 scale=widthScale; }else{ scale=heightScale; } if(scale<1){ scale=1; } Log.i(TAG,"图片分辨率压缩比例:"+scale); opts.inSampleSize=scale; opts.inJustDecodeBounds=false; Bitmapbitmap=BitmapFactory.decodeFile(imgPath,opts); returnbitmap; }
2.第二就是循环对图片的压缩,直到压缩到指定的大小以下为止(重要!)
/** *根据分辨率压缩 * *@paramsrcPath图片路径 *@paramImageSize图片大小单位kb *@return */ publicstaticbooleancompressBitmap(StringsrcPath,intImageSize,StringsavePath){ intsubtract; Log.i(TAG,"图片处理开始.."); Bitmapbitmap=compressByResolution(srcPath,1024,720);//分辨率压缩 if(bitmap==null){ Log.i(TAG,"bitmap为空"); returnfalse; } ByteArrayOutputStreambaos=newByteArrayOutputStream(); intoptions=100; bitmap.compress(Bitmap.CompressFormat.JPEG,options,baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 Log.i(TAG,"图片分辨率压缩后:"+baos.toByteArray().length/1024+"KB"); while(baos.toByteArray().length>ImageSize*1024){//循环判断如果压缩后图片是否大于ImageSizekb,大于继续压缩 subtract=setSubstractSize(baos.toByteArray().length/1024); baos.reset();//重置baos即清空baos options-=subtract;//每次都减少10 bitmap.compress(Bitmap.CompressFormat.JPEG,options,baos);//这里压缩options%,把压缩后的数据存放到baos中 Log.i(TAG,"图片压缩后:"+baos.toByteArray().length/1024+"KB"); } Log.i(TAG,"图片处理完成!"+baos.toByteArray().length/1024+"KB"); try{ FileOutputStreamfos=newFileOutputStream(newFile(savePath));//将压缩后的图片保存的本地上指定路径中 fos.write(baos.toByteArray()); fos.flush(); fos.close(); }catch(Exceptione){ e.printStackTrace(); } if(bitmap!=null){ bitmap.recycle(); } returntrue;//压缩成功返回ture }
在这其中
/** *根据图片的大小设置压缩的比例,提高速度 * *@paramimageMB *@return */ privatestaticintsetSubstractSize(intimageMB){ if(imageMB>1000){ return60; }elseif(imageMB>750){ return40; }elseif(imageMB>500){ return20; }else{ return10; } }
这个方法用来动态设置每次压缩的比例,主要用于提升压缩的时间,这其中的数值是我大概测试出来的可以修改成你认为比较合适的
3.最后
压缩图片费时又费内存,很明显执行的时候需要在子线程中完成,如果需要的话可以加一个压缩完成的监听
下载地址:CommonUtils_jb51.rar
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。