您的位置:首页 > 移动开发 > Android开发

android 图片压缩的方法

2013-01-18 15:54 274 查看
android图片压缩函数:

参考:http://104zz.iteye.com/blog/1694762

 

1. 按质量压缩:

private Bitmap compressImage(Bitmap image) {

  ByteArrayOutputStream baos = new ByteArrayOutputStream();

 //质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中  image.compress(Bitmap.CompressFormat.JPEG, 100, baos);

  int options = 100;
  //循环判断如果压缩后图片是否大于100kb,大于继续压缩 

  while ( baos.toByteArray().length / 1024>100) {    

   baos.reset();//重置baos即清空baos

    //这里压缩options%,把压缩后的数据存放到baos中

   image.compress(Bitmap.CompressFormat.JPEG, options, baos);

   options -= 10;//每次都减少1

}

  //把压缩后的数据baos存放到ByteArrayInputStream中

  ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());

   //把ByteArrayInputStream数据生成图片

  Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);

  return bitmap;

 }

 

2. 图片按比例大小压缩方法(根据路径获取图片并压缩):

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);//压缩好比例大小后再进行质量压缩
}

3. 图片按比例大小压缩方法(根据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);//压缩好比例大小后再进行质量压缩

 }

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ANDROID