压缩图片大小,尺寸不变

  • 将已知路径的图片压缩至不大于目标大小,并保存至指定路径
/**
   * 质量压缩,通过给定的路径来压缩图片并保存到指定路径
   * 
   * @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();//提醒系统及时回收
  	}
  }

绳锯木断,水滴石穿。海纳百川,积少成多。一分耕耘,一份收获。