Android图片压缩方式

一.图片的存在形式

1.文件形式(即以二进制形式存在于硬盘上)
2.流的形式(即以二进制形式存在于内存中)
3.Bitmap形式
这三种形式的区别: 文件形式和流的形式对图片体积大小并没有影响,也就是说,如果你手机SD卡上的如果是100K,那么通过流的形式读到内存中,也一定是占100K的内存,注意是流的形式,不是Bitmap的形式,当图片以Bitmap的形式存在时,其占用的内存会瞬间变大, 500K文件形式的图片加载到内存,以Bitmap形式存在时,占用内存将近10M,当然这个增大的倍数并不是固定的

检测图片三种形式大小的方法:
文件形式: file.length()
流的形式: 讲图片文件读到内存输入流中,看它的byte数

二.常见的压缩方式

*******************************图片压缩两种方式*******************************************
一.质量压缩法
/**
 * 压缩方式一:质量压缩方法
 *
 * @param image
 * @return
 */
public static 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即清空baos
      baos.reset();
      //这里压缩options%,把压缩后的数据存放到baos      image.compress(Bitmap.CompressFormat.JPEG, options, baos);
      options -= 10;//每次都减少10
   }
   //把压缩后的数据baos存放到ByteArrayInputStream   ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
   //ByteArrayInputStream数据生成图片
   Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);
   return bitmap;
}

二.图片按比例压缩
/**
 * 压缩方式二:图片按比例大小压缩方法(根据路径获取图片并压缩)
 *
 * @param srcPath
 * @return
 */
public static Bitmap getimage(String srcPath) {
   BitmapFactory.Options newOpts = new BitmapFactory.Options();
   //开始读入图片,此时把options.inJustDecodeBounds 设回true   newOpts.inJustDecodeBounds = true;
   //此时返回bm为空
   Bitmap bitmap = BitmapFactory.decodeFile(srcPath, 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   bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
   return compressImage(bitmap);//压缩好比例大小后再进行质量压缩
}

/**
 * 压缩方式三:图片按比例大小压缩方法(根据Bitmap图片压缩)
 *
 * @param image
 * @return
 */
public static 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
      //这里压缩50%,把压缩后的数据存放到baos      image.compress(Bitmap.CompressFormat.JPEG, 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和Java技术栈》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值