搜索
热搜: 活动 交友 discuz
查看: 4245|回复: 0
打印 上一主题 下一主题

android图片压缩的几种方法

[复制链接]

160

主题

165

帖子

814

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
814
跳转到指定楼层
楼主
发表于 2016-7-21 10:57:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
android 图片压缩方法:
第一:质量压缩法:

  1. private Bitmap compressImage(Bitmap image) {
  2.         ByteArrayOutputStream baos = new ByteArrayOutputStream();
  3.         image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
  4.         int options = 100;
  5.         while ( baos.toByteArray().length / 1024>100) {    //循环判断如果压缩后图片是否大于100kb,大于继续压缩        
  6.             baos.reset();//重置baos即清空baos
  7.             options -= 10;//每次都减少10
  8.             image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中

  9.         }
  10.         ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
  11.         Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
  12.         return bitmap;
  13.     }
复制代码
第二:图片按比例大小压缩方法(根据路径获取图片并压缩):

  1. private Bitmap getimage(String srcPath) {
  2.         BitmapFactory.Options newOpts = new BitmapFactory.Options();
  3.         //开始读入图片,此时把options.inJustDecodeBounds 设回true了
  4.         newOpts.inJustDecodeBounds = true;
  5.         Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空

  6.         newOpts.inJustDecodeBounds = false;
  7.         int w = newOpts.outWidth;
  8.         int h = newOpts.outHeight;
  9.         //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
  10.         float hh = 800f;//这里设置高度为800f
  11.         float ww = 480f;//这里设置宽度为480f
  12.         //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
  13.         int be = 1;//be=1表示不缩放
  14.         if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放
  15.             be = (int) (newOpts.outWidth / ww);
  16.         } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
  17.             be = (int) (newOpts.outHeight / hh);
  18.         }
  19.         if (be <= 0)
  20.             be = 1;
  21.         newOpts.inSampleSize = be;//设置缩放比例
  22.         //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
  23.         bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
  24.         return compressImage(bitmap);//压缩好比例大小后再进行质量压缩
  25.     }
复制代码

图片比例压缩时, 我看到一个算法,说比较快。。
be = (int) ((w / STANDARD_WIDTH + h/ STANDARD_HEIGHT) / 2);
结论二:图片比例压缩倍数 就是 (宽度压缩倍数+高度压缩倍数)/2..

第三:图片按比例大小压缩方法(根据Bitmap图片压缩):
  1. private Bitmap comp(Bitmap image) {

  2.         ByteArrayOutputStream baos = new ByteArrayOutputStream();        
  3.         image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
  4.         if( baos.toByteArray().length / 1024>1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出   
  5.             baos.reset();//重置baos即清空baos
  6.             image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩50%,把压缩后的数据存放到baos中
  7.         }
  8.         ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
  9.         BitmapFactory.Options newOpts = new BitmapFactory.Options();
  10.         //开始读入图片,此时把options.inJustDecodeBounds 设回true了
  11.         newOpts.inJustDecodeBounds = true;
  12.         Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
  13.         newOpts.inJustDecodeBounds = false;
  14.         int w = newOpts.outWidth;
  15.         int h = newOpts.outHeight;
  16.         //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
  17.         float hh = 800f;//这里设置高度为800f
  18.         float ww = 480f;//这里设置宽度为480f
  19.         //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
  20.         int be = 1;//be=1表示不缩放
  21.         if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放
  22.             be = (int) (newOpts.outWidth / ww);
  23.         } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
  24.             be = (int) (newOpts.outHeight / hh);
  25.         }
  26.         if (be <= 0)
  27.             be = 1;
  28.         newOpts.inSampleSize = be;//设置缩放比例
  29.         newOpts.inPreferredConfig = Config.RGB_565;//降低图片从ARGB888到RGB565
  30.         //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
  31.         isBm = new ByteArrayInputStream(baos.toByteArray());
  32.         bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
  33.         return compressImage(bitmap);//压缩好比例大小后再进行质量压缩
  34.     }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|安卓论坛  

GMT+8, 2024-5-18 12:17 , Processed in 0.057034 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Design S!|ƽ̶

快速回复 返回顶部 返回列表