Android开发之图片压缩工具类完整实例
本文实例讲述了Android图片压缩工具类。分享给大家供大家参考,具体如下:
这里共享一个图片压缩工具类:
packagecom.sanweidu.TddPay.util2;
importjava.io.ByteArrayInputStream;
importjava.io.ByteArrayOutputStream;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
publicclassImaZipUtil{
/**
*压缩图片到指定宽高,并进行质量压缩,最终大小保持在100K以下
*
*@paramsourceBm
*@paramtargetWidth
*@paramtargetHeight
*@return
*/
publicstaticBitmapzipPic(BitmapsourceBm,floattargetWidth,floattargetHeight){
BitmapFactory.OptionsnewOpts=newBitmapFactory.Options();
//开始读入图片,此时把options.inJustDecodeBounds设回true了
newOpts.inJustDecodeBounds=true;
//可删除
newOpts.inPurgeable=true;
//可共享
newOpts.inInputShareable=true;
//转成数组
ByteArrayOutputStreambaos=newByteArrayOutputStream();
sourceBm.compress(Bitmap.CompressFormat.JPEG,100,baos);
byte[]temp=baos.toByteArray();
//此时返回bm为空
Bitmapbitmap=BitmapFactory.decodeByteArray(temp,0,temp.length,newOpts);
newOpts.inJustDecodeBounds=false;
intw=newOpts.outWidth;
inth=newOpts.outHeight;
//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
floathh=targetHeight;
floatww=targetWidth;
//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
intbe=1;//be=1表示不缩放
//如果宽度大的话根据宽度固定大小缩放
if(w>h&&w>ww){
be=(int)(newOpts.outWidth/ww);
}elseif(whh){
//如果高度高的话根据宽度固定大小缩放
be=(int)(newOpts.outHeight/hh);
}
if(be<=0){
be=1;
}
//设置缩放比例
newOpts.inSampleSize=be;
//重新读入图片,注意此时已经把options.inJustDecodeBounds设回false了
bitmap=BitmapFactory.decodeByteArray(temp,0,temp.length,newOpts);
//压缩好比例大小后再进行质量压缩
returncompressImage(bitmap);
}
/**
*@Description质量压缩方法
*@authorXiongJie
*@paramimage
*@return
*/
publicstaticBitmapcompressImage(Bitmapimage){
ByteArrayOutputStreambaos=newByteArrayOutputStream();
//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
image.compress(Bitmap.CompressFormat.JPEG,100,baos);
intoptions=100;
//循环判断如果压缩后图片是否大于100kb,大于继续压缩
while(baos.toByteArray().length/1024>100){
//重置baos即清空baos
baos.reset();
//这里压缩options%,把压缩后的数据存放到baos中
image.compress(Bitmap.CompressFormat.JPEG,options,baos);
//每次都减少10
options-=10;
}
//把压缩后的数据baos存放到ByteArrayInputStream中
ByteArrayInputStreamisBm=newByteArrayInputStream(baos.toByteArray());
//把ByteArrayInputStream数据生成图片
Bitmapbitmap=BitmapFactory.decodeStream(isBm,null,null);
returnbitmap;
}
/**
*只进行分辨率压缩,不进行图片的质量压缩
*
*@paramsourceBm
*@paramtargetWidth
*@paramtargetHeight
*@return
*/
publicstaticBitmapzipPicWithoutCompress(BitmapsourceBm,floattargetWidth,floattargetHeight){
BitmapFactory.OptionsnewOpts=newBitmapFactory.Options();
//开始读入图片,此时把options.inJustDecodeBounds设回true了
newOpts.inJustDecodeBounds=true;
//可删除
newOpts.inPurgeable=true;
//可共享
newOpts.inInputShareable=true;
//转成数组
ByteArrayOutputStreambaos=newByteArrayOutputStream();
sourceBm.compress(Bitmap.CompressFormat.JPEG,100,baos);
byte[]temp=baos.toByteArray();
//此时返回bm为空
Bitmapbitmap=BitmapFactory.decodeByteArray(temp,0,temp.length,newOpts);
newOpts.inJustDecodeBounds=false;
intw=newOpts.outWidth;
inth=newOpts.outHeight;
//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
floathh=targetHeight;
floatww=targetWidth;
//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
//be=1表示不缩放
intbe=1;
if(w>h&&w>ww){
//如果宽度大的话根据宽度固定大小缩放
be=(int)(newOpts.outWidth/ww);
}elseif(whh){
//如果高度高的话根据宽度固定大小缩放
be=(int)(newOpts.outHeight/hh);
}
if(be<=0){
be=1;
}
//设置缩放比例
newOpts.inSampleSize=be;
//重新读入图片,注意此时已经把options.inJustDecodeBounds设回false了
bitmap=BitmapFactory.decodeByteArray(temp,0,temp.length,newOpts);
//压缩好比例大小后再进行质量压缩
returnbitmap;
}
}
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android图形与图像处理技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。