Android图片压缩

一.质量压缩

private Bitmap compressImage(){
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  //质量压缩方法,100表示不压缩,把压缩后的数据存放到baos中
  image.compress(Bitmap.CompressFormat.JPEG,100,baos);
  int options = 100;

  //循环判断,压缩后图片是否大于100kb,大于继续压缩
  while(baos.toByteArray().length / 1024>100){
    //重置baos即清空baos
    baos.reset();
    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;
}

二.按比例大小压缩(根据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);
  //判断如果图片大于1M,进行压缩避免在生成图片 (BitmapFactory.decodeStream)时溢出
  if( baos.toByteArray().length / 1024>1024) {
    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);//压缩好比例大小后再进行质量压缩
}

你可能感兴趣的:(Android图片压缩)