系统图片裁剪

项目中用到图片裁剪,碰到两个问题,在此做下记录

  1. 裁剪大图片
public static Intent cropRawPhoto(Uri uri, int aspectX, int aspectY, int output_X, int output_Y) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        // 设置裁剪
        intent.putExtra("crop", "true");
        // aspectX , aspectY :宽高的比例
        intent.putExtra("aspectX", aspectX);
        intent.putExtra("aspectY", aspectY);
        // outputX , outputY : 裁剪图片宽高
        intent.putExtra("outputX", output_X);
        intent.putExtra("outputY", output_Y);
        intent.putExtra("return-data", false);

        File file = new File(MainApp.getPhotoCachePath() + "temp.jpg");
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        Uri outputUri = Uri.fromFile(file);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
        return intent;
    }

需要裁剪的图片比较大,如果在裁剪后直接将图片数据返回,则容易出现oom,所以我们需要设置不返回图片数据,同时将裁剪后的图片保存到sd卡上的临时文件。
intent.putExtra("return-data", false);
这里的“return-data” 为false,表示将不返回图片裁剪后数据;true则返回图片数据。
之后将裁剪后的数据,输出到sd卡中

 File file = new File(MainApp.getPhotoCachePath() + "temp.jpg");
     if (!file.exists()) {
         try {
             file.createNewFile();
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
     Uri outputUri = Uri.fromFile(file);

最后我们将通过返回的outputUri来获取裁剪后的图片信息,当然也可以直接去访问sd卡中的图片文件temp.jpg

  1. 设置裁剪框大小
 // aspectX , aspectY :宽高的比例
 intent.putExtra("aspectX", aspectX);
 intent.putExtra("aspectY", aspectY);

"aspectX"和"aspectY"分别表示裁剪框的宽高。
注意这里的值最好设置为整型而不用float等其他类型。设置为整型比例,裁剪框才能固定比例。而float类型,在测试之后发现,大部分手机都不能固定宽高比,只有一款乐视手机能固定。
同时设置等比,如1:1,有的手机,会出现一个圆形的裁剪框,但有的手机不会

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