压缩图片大小,尺寸不变

  • 将已知路径的图片压缩至不大于目标大小,并保存至指定路径

      /**
       * 质量压缩,通过给定的路径来压缩图片并保存到指定路径
       * 
       * @param srcPath
       *            资源图片的路径
       * @param savePath
       *            图片的保存路径
       * @param aimSize
       *            压缩到图片大小的最大值
       */
      public static void compressImageByPath(String srcPath, String savePath,
      		int aimSize) {
      	// 注意savePath的文件夹和文件的判断
      	Bitmap imgBitmap = BitmapFactory.decodeFile(srcPath);
      	ByteArrayOutputStream baos = new ByteArrayOutputStream();
      	int percent = 100;// 定义压缩比例,初始为不压缩
      	imgBitmap.compress(Bitmap.CompressFormat.JPEG, percent, baos);
      	int currentSize = baos.toByteArray().length / 1024;
      	while (currentSize > aimSize) {// 循环判断压缩后图片是否大于目的大小,若大于则继续压缩
      		baos.reset();// 重置baos,即清空baos
      		//注意:此处该方法的第一个参数必须为JPEG,若为PNG则无法压缩。
      		imgBitmap.compress(Bitmap.CompressFormat.JPEG, percent, baos);
      		currentSize = baos.toByteArray().length / 1024;
      		percent -= 5;
      		if (percent <= 0) {
      			break;
      		}
      	}
    
      	try {//将数据写入输出流
      		FileOutputStream fos = new FileOutputStream(savePath);
      		baos.writeTo(fos);
      	} catch (Exception e) {
      		e.printStackTrace();
      	} finally {
      		try {//清空缓存,关闭流
      			baos.flush();
      			baos.close();
      		} catch (Exception e) {
      			e.printStackTrace();
      		}
      	}
      	if (!imgBitmap.isRecycled()) {
      		imgBitmap.recycle();//回收图片所占的内存
      		System.gc();//提醒系统及时回收
      	}
      }