Android图片压缩的实例详解
Android图片压缩的实例详解
在做微信分享的时候,由于分享的缩略图要求不得大于32K,否则不能调起微信,所以总结了一下Android图片的压缩问题,大部分资料都是来自网上各位的分享,自己只是完善或修改了一下,本着继续分享的精神,也方便自己记忆,于是总结如下。
android图片压缩主要有两种方式:1.压缩图片分辨率2.压缩图片质量
一、先看压缩图片分辨率,很好理解,如本来1280*768的图片压缩为640*384大小。废话不说,直接上代码:
/**
*按比例压缩图片分辨率
*@paraminBitmap
*@paramoutHeight输出图片高度,可据此保持比例计算输出宽度
*@paramneedRecycled是否回收inBitmap
*@return
*/
publicstaticBitmapcreateScaledBitmapByOutHeight(BitmapinBitmap,intoutHeight,booleanneedRecycled){
intbitmapHeight=inBitmap.getHeight();
intbitmapWidth=inBitmap.getWidth();
intoutWidth=bitmapWidth*outHeight/bitmapHeight;
returncreateScaledBitmap(inBitmap,outWidth,outHeight,needRecycled);
}
/**
*按比例压缩图片分辨率
*@paraminBitmap
*@paramoutHeight输出图片宽度,可据此保持比例计算输出高度
*@paramneedRecycled是否回收inBitmap
*@return
*/
publicstaticBitmapcreateScaledBitmapByOutWidth(BitmapinBitmap,intoutWidth,booleanneedRecycled){
intbitmapHeight=inBitmap.getHeight();
intbitmapWidth=inBitmap.getWidth();
intoutHeight=bitmapHeight*outWidth/bitmapWidth;
returncreateScaledBitmap(inBitmap,outWidth,outHeight,needRecycled);
}
/**
*指定输出的宽高缩放图片
*@paraminBitmap
*@paramoutWidth
*@paramoutHeight
*@paramneedRecycled
*@return
*/
publicstaticBitmapcreateScaledBitmap(BitmapinBitmap,intoutWidth,intoutHeight,booleanneedRecycled){
BitmapthumbBmp=Bitmap.createScaledBitmap(inBitmap,outWidth,outHeight,true);
if(needRecycled){
inBitmap.recycle();
}
returnthumbBmp;
}
前两个方法可以指定期望的宽度或高度,并按比例缩放图片的分辨率,第3个方法可以随意指定期望的宽高,缩放图片。
上面代码是对输入的bitmap进行缩放,还可以从资源或文件中加载图片并缩放,具体如下:
/**
*从资源加载并压缩图片
*@paramres
*@paramresId
*@paramoutWidth目标宽度
*@paramoutHeight目标高度
*@return
*/
publicstaticBitmapdecodeSampledBitmapFromResource(Resourcesres,intresId,
intoutWidth,intoutHeight){
finalBitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inJustDecodeBounds=true;//假解,来获取图片大小
BitmapFactory.decodeResource(res,resId,options);
options.inSampleSize=calculateInSampleSize(options,outWidth,outHeight);
//使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds=false;
//options.inPreferredConfig=Config.RGB_565;
returnBitmapFactory.decodeResource(res,resId,options);
}
/**
*从文件中加载并压缩图片
*@paramres
*@paramresId
*@paramoutWidth目标宽度
*@paramoutHeight目标高度
*@return
*/
publicstaticBitmapdecodeSampledBitmapFromFile(StringpathName,intoutWidth,intoutHeight){
finalBitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inJustDecodeBounds=true;//假解,来获取图片大小
BitmapFactory.decodeFile(pathName,options);
options.inSampleSize=calculateInSampleSize(options,outWidth,outHeight);
//使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds=false;
//options.inPreferredConfig=Config.RGB_565;
returnBitmapFactory.decodeFile(pathName,options);
}
/**
*计算options.inSampleSize
*@paramoptions
*@paramreqWidth
*@paramreqHeight
*@return
*/
publicstaticintcalculateInSampleSize(BitmapFactory.Optionsoptions,
intreqWidth,intreqHeight){
//源图片的高度和宽度
finalintheight=options.outHeight;
finalintwidth=options.outWidth;
intinSampleSize=1;
if(height>reqHeight||width>reqWidth){
//计算出实际宽高和目标宽高的比率
finalintheightRatio=Math.round((float)height/(float)reqHeight);
finalintwidthRatio=Math.round((float)width/(float)reqWidth);
//选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
//一定都会大于等于目标的宽和高。
inSampleSize=heightRatio
二、压缩图片的质量
/**
*压缩图片质量,把图片压缩到outSize以内
*@paraminBitmap原始bitmap
*@paramoutSize压缩到的大小
*@paramneedRecycled是否回收bitmap
*@return
*/
publicstaticBitmapcompressImage(BitmapinBitmap,intoutSize,booleanneedRecycled){
ByteArrayOutputStreambaos=newByteArrayOutputStream();
inBitmap.compress(Bitmap.CompressFormat.JPEG,100,baos);
intquality=100;
while(baos.toByteArray().length/1024>outSize){
if(quality<=0){
ByteArrayInputStreamoutBais=newByteArrayInputStream(baos.toByteArray());
returnBitmapFactory.decodeStream(outBais,null,null);//如果quaLity为0时还未达到32k以内,返回得到的最小值;如需要可结合分辨率压缩
}
baos.reset();
//PNG格式下,这种压缩不起作用(quality:0-100,如果目标大小太小,有时候质量压缩不一定能达到效果,需结合分辨率压缩)
inBitmap.compress(Bitmap.CompressFormat.JPEG,quality,baos);
Log.e("AN","bitmapsize:"+baos.toByteArray().length/1024+"k");
quality-=10;
}
if(needRecycled){
inBitmap.recycle();
}
ByteArrayInputStreambais=newByteArrayInputStream(baos.toByteArray());
BitmapoutBitmap=BitmapFactory.decodeStream(bais,null,null);//ByteArrayInputStream转成bitmap
returnoutBitmap;
}
需要注意的是compress方法,该压缩方法只对JPEG格式有效,对于PNG格式,则会忽略第二个参数quality,即压缩不起作用。这种压缩只是对图片质量有影响,并不会改变图片大小。
当然,如有需要,以上两种压缩方法可以结合使用。
以上就是Android图片压缩的实现方法的详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!