【android图片压缩方法】幼敏悟过人,读书辄成诵。这篇文章主要讲述android图片压缩方法相关的知识,希望能为你提供帮助。
第一:我们先看下质量压缩方法
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);
//压缩好比例大小后再进行质量压缩
}
推荐阅读
- 360免费升级win10下载
- android图像处理系列之六--给图片添加边框(下)-图片叠加
- android图片特效处理之锐化效果
- android图片特效处理之图片叠加
- android图像处理底片效果
- android图片特效处理之光照效果
- Android 给图片加边框
- android图像处理系列之四-- 给图片添加边框(上)
- 在Android中调用KSOAP2库访问webservice服务出现的服务端返回AnyType{}