android 图片压缩的三种方法,其实还有第四种就是2.2以后提供的压缩类
![此博文包含图片](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
![此博文包含视频](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
标签: 杂谈 |
第一:我们先看下质量压缩方法:
- private
Bitmap compressImage(Bitmap image) { -
-
ByteArrayOutputStream baos = new ByteArrayOutputStream(); -
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 -
int options = 100; -
while ( baos.toByteArray().length / 1024>100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩 -
baos.reset();//重置baos即清空baos -
image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中 -
options -= 10;//每次都减少10 -
} -
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中 -
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片 -
return bitmap; -
}
第二:图片按比例大小压缩方法(根据路径获取图片并压缩):
- private
Bitmap getimage(String srcPath) { -
BitmapFactory.Options newOpts = new BitmapFactory.Options(); -
//开始读入图片,此时把options.inJustDecodeBounds 设回true了 -
newOpts.inJustDecodeBounds = true; -
Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空 -
-
newOpts.inJustDecodeBounds = false; -
int w = newOpts.outWidth; -
int h = newOpts.outHeight; -
//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为 -
float hh = 800f;//这里设置高度为800f -
float ww = 480f;//这里设置宽度为480f -
//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 -
int be = 1;//be=1表示不缩放 -
if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放 -
be = (int) (newOpts.outWidth / ww); -
} else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放 -
be = (int) (newOpts.outHeight / hh); -
} -
if (be <= 0) -
be = 1; -
newOpts.inSampleSize = be;//设置缩放比例 -
//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了 -
bitmap = BitmapFactory.decodeFile(srcPath, newOpts); -
return compressImage(bitmap);//压缩好比例大小后再进行质量压缩 -
}
第三:图片按比例大小压缩方法(根据Bitmap图片压缩):
- private
Bitmap comp(Bitmap image) { -
-
ByteArrayOutputStream baos = new ByteArrayOutputStream(); -
image.compress(Bitmap.CompressFormat.JPEG, 100, baos); -
if( baos.toByteArray().length / 1024>1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出 -
baos.reset();//重置baos即清空baos -
image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩50%,把压缩后的数据存放到baos中 -
} -
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray()); -
BitmapFactory.Options newOpts = new BitmapFactory.Options(); -
//开始读入图片,此时把options.inJustDecodeBounds 设回true了 -
newOpts.inJustDecodeBounds = true; -
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts); -
newOpts.inJustDecodeBounds = false; -
int w = newOpts.outWidth; -
int h = newOpts.outHeight; -
//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为 -
float hh = 800f;//这里设置高度为800f -
float ww = 480f;//这里设置宽度为480f -
//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 -
int be = 1;//be=1表示不缩放 -
if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放 -
be = (int) (newOpts.outWidth / ww); -
} else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放 -
be = (int) (newOpts.outHeight / hh); -
} -
if (be <= 0) -
be = 1; -
newOpts.inSampleSize = be;//设置缩放比例 -
//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了 -
isBm = new ByteArrayInputStream(baos.toByteArray()); -
bitmap = BitmapFactory.decodeStream(isBm, null, newOpts); -
return compressImage(bitmap);//压缩好比例大小后再进行质量压缩 - }