android 图片压缩一般有两种方式
1是质量压缩法2是大小压缩法 一般是根据用的比较多的是质量压缩法 大小压缩对于清晰度影响比较大.
质量压缩法
Bitmap bitmap=BitmapFactory.decodeFile(file.getPath());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
while ( baos.toByteArray().length / 1024>100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩
baos.reset();//重置baos即清空baos
int options = 100;
bitmap.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);
//压缩好比例大小后再进行质量压缩
}
- /**
- * 分辨率压缩 在质量压缩
- *
- * @param 路劲
- * @return </br> 处理之后的路劲
- * @throws IOException
- */
- public static String perUploadPic(String path) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- BitmapFactory.Options newOpts = new BitmapFactory.Options();
- newOpts.inJustDecodeBounds = true;
- BitmapFactory.decodeFile(path, newOpts);// 打开空图片获取分辨率
- newOpts.inSampleSize = getinSampleSize(newOpts);// 设置缩放倍数
- newOpts.inJustDecodeBounds = false;
- try {
- Bitmap bitmap1 = BitmapFactory.decodeFile(path, newOpts);
- bitmap1.compress(CompressFormat.JPEG, 80, baos);
- } catch (OutOfMemoryError e) {
- Log.e("OutOfMemoryError", "图片上传压缩初次分辨率失败");
- newOpts.inSampleSize = newOpts.inSampleSize + 2;
- Bitmap bitmap1 = BitmapFactory.decodeFile(path, newOpts);
- bitmap1.compress(CompressFormat.JPEG, 80, baos);
- }
- Log.e("压缩后分辨率:", newOpts.outWidth + "*" + newOpts.outHeight);
- Log.e("分辨率压缩后的大小:", (baos.toByteArray().length / 1024) + "");
- // ByteArrayOutputStream baos = new ByteArrayOutputStream();
- // baos.write(bytes);
- Bitmap bitmap = null;
- int options = 90;
- while (baos.toByteArray().length / 1024 > 100) { //
- if (bitmap == null)
- bitmap = BitmapFactory.decodeByteArray(baos.toByteArray(), 0,
- baos.toByteArray().length);
- else
- baos.reset();
- bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//
- options -= 5;//
- Log.e("baos.toByteArray().length:", +baos.toByteArray().length + "");
- }
- Log.e("质量压缩后的大小:", (baos.toByteArray().length / 1024) + "");
- FileOutputStream out = null;
- File file = null;
- try {
- String[] name = path.split("/");//路劲大家自己写哈
- file = new File(getSDPath() + "/" + Constant.path.PAHN + "/"
- + Constant.path.cameraper + "/" + name[name.length - 1]);
- if (!file.getParentFile().exists())
- file.getParentFile().mkdirs();
- if (!file.exists())
- file.createNewFile();
- out = new FileOutputStream(file);
- out.write(baos.toByteArray());
- out.flush();
- out.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- try {
- out.close();
- baos.reset();
- baos = null;
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- Log.e("yung", "待上传图片压缩处理失败:" + path);
- e.printStackTrace();
- }
- return file.getAbsolutePath();
- }
- /**
- * 获取图片压缩的比率
- *
- * @param options
- * @return
- */
- public static int getinSampleSize(BitmapFactory.Options options) {
- final int height = options.outHeight;
- final int width = options.outWidth;
- float reqHeight = 960.0f;//根据自己需要确定分辨率长或者宽最大不超过960 并且按照原来比例
- float reqWidth = 960.0f;
- int inSampleSize = 1;
- if (height > width && height > reqHeight) {
- inSampleSize = (int) Math.ceil(height / reqHeight);
- } else if (height <= width && width > reqWidth) {
- inSampleSize = (int) Math.ceil(width / reqWidth);
- }
- System.out.println("压缩前分辨率:" + width + "*" + height + " 压缩倍数:"
- + inSampleSize);
- return inSampleSize;
- }