项目中用到图片裁剪,碰到两个问题,在此做下记录
- 裁剪大图片
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
- 设置裁剪框大小
// aspectX , aspectY :宽高的比例
intent.putExtra("aspectX", aspectX);
intent.putExtra("aspectY", aspectY);
"aspectX"和"aspectY"分别表示裁剪框的宽高。
注意这里的值最好设置为整型而不用float等其他类型。设置为整型比例,裁剪框才能固定比例。而float类型,在测试之后发现,大部分手机都不能固定宽高比,只有一款乐视手机能固定。
同时设置等比,如1:1,有的手机,会出现一个圆形的裁剪框,但有的手机不会