图片压缩算法

来源:互联网 发布:淘宝装修设计 编辑:程序博客网 时间:2024/05/21 14:55

通用裁图逻辑:

第一:我们先看下质量压缩方法:

private Bitmap compressImage(Bitmap image) {      ByteArrayOutputStream baos = new ByteArrayOutputStream();      //质量压缩方法,这里100表示不压缩,把压缩后的数据存入baos中      image.compress(Bitmap.CompressFormat.JPEG, 100, baos);    int options = 100;      while ( baos.size() / 1024>100) {  //循环判断如果压缩后图片是否大于100kb,大于继续压缩                 baos.reset();//重置baos即清空baos          image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中          options -= 10;//每次都减少10      }      //把压缩后的数据baos存放到ByteArrayInputStream中      ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());    //把ByteArrayInputStream数据生成图片      Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);    return bitmap;  }  

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

private 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图片压缩):

private Bitmap comp(Bitmap image) {            ByteArrayOutputStream baos = new ByteArrayOutputStream();             image.compress(Bitmap.CompressFormat.JPEG, 100, baos);      //判断如果图片大于1M,进行压缩避免在生成图片时溢出     if( bass.size() / 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);      //如果高度高的话根据宽度固定大小缩放  z       } 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);//压缩比例后进行质量压缩  }  

常用简单方法:

  • 上面的几种方法是以字节流的方式裁剪图片。现在,再来看一种简单的裁剪方法,这个裁剪方法是通过Bitmap的创建功能来截取原图的部分数据:
 /** 图片裁剪:按指定大小裁剪 */public Bitmap tailorImageByImgs(String srcPath, int hh, int ww) {    BitmapFactory.Options newOpts = new BitmapFactory.Options();    Bitmap bitmap = BitmapFactory.decodeFile(srcPath);    int w = bitmap.getWidth();    int h = bitmap.getHeight();    int retX = w > ww ? (w - ww) / 2 : 0;//基于原图,取正方形左上角x坐标    int retY = h > hh ? (h - hh) / 2 : 0;    //下面这句是关键    return Bitmap.createBitmap(bitmap, retX, retY, hh, ww, null, false);}
1 0
原创粉丝点击