使用系统Intent裁剪图片

说明

使用Android系统中的Intent来进行简单的图片裁剪,裁剪完成后的数据可以保存为完整图片文件,或者获得一个较小的bitmap


裁剪Intent及处理方式

从相册选择图片进行裁剪

  /**
   * 从相册中选取图片进行裁剪.
   *
   * @param imageUri   截取完成后图片保存位置
   * @param aspectX    裁切区域选取时横向的比例
   * @param aspectY    裁切区域选取时纵向的比例
   * @param outputX    裁切完成后图片输出横向像素
   * @param outputY    裁切完成后图片输出纵向像素
   * @param returnData
   * 是否在{@link android.app.Activity#onActivityResult(int, int, Intent)}中返回一个较小的{@code Bitmap}
   * @return 返回一个可以通过
   * {@link android.app.Activity#startActivityForResult(Intent, int)}启动的{@link Intent}
   */
  private Intent newGalleryCropIntent(Uri imageUri, int aspectX, int aspectY, int outputX, int
          outputY, boolean returnData) {

      Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
      intent.setType("image/*");
      intent.putExtra("crop", "true");
      intent.putExtra("aspectX", aspectX);
      intent.putExtra("aspectY", aspectY);
      intent.putExtra("outputX", outputX);
      intent.putExtra("outputY", outputY);
      intent.putExtra("scale", true);
      intent.putExtra("return-data", returnData);
      intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
      intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
      intent.putExtra("noFaceDetection", true); // no face detection

      return intent;
  }

拍照后进行裁剪

  1. 拍照
  Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  if (cameraIntent.resolveActivity(getPackageManager()) != null) {
      cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);// imageUri为拍照后存储图片的位置
      startActivityForResult(cameraIntent, REQUEST_CODE_TAKE_BIG);
  }
  1. 裁剪图片
  /**
   * 根据给定的Uri位置裁切图片.
   *
   * @param imageUri   要被裁切的图片位置/本方法中同时也是裁切完成后保存图片的位置
   * @param aspectX    裁切区域选取时横向的比例
   * @param aspectY    裁切区域选取时纵向的比例
   * @param outputX    裁切完成后图片输出横向像素
   * @param outputY    裁切完成后图片输出纵向像素
   * @param returnData
   * 是否在{@link android.app.Activity#onActivityResult(int, int, Intent)}中返回一个较小的{@code Bitmap}
   * @return 返回一个可以通过
   * {@link android.app.Activity#startActivityForResult(Intent, int)}启动的{@link Intent}
   */
  private Intent newCropIntent(Uri imageUri, int aspectX, int aspectY, int outputX, int
          outputY, boolean returnData) {

      Intent intent = new Intent("com.android.camera.action.CROP");
      intent.setDataAndType(imageUri, "image/*");
      intent.putExtra("crop", "true");
      intent.putExtra("aspectX", aspectX);
      intent.putExtra("aspectY", aspectY);
      intent.putExtra("outputX", outputX);
      intent.putExtra("outputY", outputY);
      intent.putExtra("scale", true);
      intent.putExtra("return-data", returnData);
      intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
      intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
      intent.putExtra("noFaceDetection", true); // no face detection

      return intent;
  }

裁剪完成后的数据处理

  • 若输出到本地文件后读取为Bitmap对象使用

      Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
    
  • 直接返回一个较小的Bitmap对象

      Bitmap bitmap = data.getParcelableExtra("data");// data为onActivityResult方法中返回的Intent
    

参考

  • Android大图片裁剪终极解决方案原理分析
  • how to set the output image use com.android.camera.action.CROP

Demo

  • 源代码地址

你可能感兴趣的:(使用系统Intent裁剪图片)