Android图片压缩

下面是编程之家 jb51.cc 通过网络收集整理的代码片段。

编程之家小编现在分享给大家,也给大家做个参考。

private Bitmap compressImage(Bitmap image) {
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  //质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
  image.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
  int options = 100;
  while ( baos.toByteArray().length / 1024>100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩  
   baos.reset();//重置baos即清空baos
   //这里压缩options%,把压缩后的数据存放到baos中
   image.compress(Bitmap.CompressFormat.JPEG, options, baos); 
   options -= 10;//每次都减少10
  }
  //把压缩后的数据baos存放到ByteArrayInputStream中 
  ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
  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);//压缩好比例大小后再进行质量压缩

 }
 private Bitmap comp(Bitmap image) {

  ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  image.compress(Bitmap.CompressFormat.JPEG, 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, 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, newOpts);

  return compressImage(bitmap);//压缩好比例大小后再进行质量压缩

 }

以上是编程之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...