項(xiàng)目中用到圖片裁剪沥曹,碰到兩個(gè)問題髓帽,在此做下記錄
- 裁剪大圖片
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/*");
// 設(shè)置裁剪
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;
}
需要裁剪的圖片比較大,如果在裁剪后直接將圖片數(shù)據(jù)返回驳阎,則容易出現(xiàn)oom抗愁,所以我們需要設(shè)置不返回圖片數(shù)據(jù),同時(shí)將裁剪后的圖片保存到sd卡上的臨時(shí)文件。
intent.putExtra("return-data", false);
這里的“return-data” 為false呵晚,表示將不返回圖片裁剪后數(shù)據(jù)蜘腌;true則返回圖片數(shù)據(jù)。
之后將裁剪后的數(shù)據(jù)饵隙,輸出到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來獲取裁剪后的圖片信息撮珠,當(dāng)然也可以直接去訪問sd卡中的圖片文件temp.jpg
- 設(shè)置裁剪框大小
// aspectX , aspectY :寬高的比例
intent.putExtra("aspectX", aspectX);
intent.putExtra("aspectY", aspectY);
"aspectX"和"aspectY"分別表示裁剪框的寬高。
注意這里的值最好設(shè)置為整型而不用float等其他類型金矛。設(shè)置為整型比例芯急,裁剪框才能固定比例勺届。而float類型,在測試之后發(fā)現(xiàn)志于,大部分手機(jī)都不能固定寬高比涮因,只有一款樂視手機(jī)能固定。
同時(shí)設(shè)置等比伺绽,如1:1养泡,有的手機(jī),會(huì)出現(xiàn)一個(gè)圓形的裁剪框奈应,但有的手機(jī)不會(huì)