APP 中选取图片之后,有时候需要进行剪裁,比如头像。
以下是启动代码。
在我的项目中,传的是 filePath,所以我转了一下,但实际上从相册选择图片后,用 data.getData() 就可获得 uri。Uri uri = Uri.fromFile(new File(filePath));
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(, "image/*");
intent.putExtra("crop", "true"); // 可剪裁
intent.putExtra("aspectX", 10); // 高比例
intent.putExtra("aspectY", 10); // 宽比例
intent.putExtra("outputX", size); // 宽尺寸
intent.putExtra("outputY", size); // 高尺寸
intent.putExtra("scale", true); // 保持比例
intent.putExtra("return-data", true); // 剪裁后,是否返回 Bitmap
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); // 输出 JPEG
intent.putExtra("noFaceDetection", false); // 人脸识别,开启后,探测到人脸后会将剪裁框移到人脸上
activity.startActivityForResult(intent, 123456); // 启动
以下是剪裁后的处理:@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 123456 && resultCode == RESULT_OK) {
// 用户头像剪裁后
Bitmap bitmap = data.getExtras().getParcelable("data");
// 演示保存到缓存中
// 目录
String cacheDirectoryPath = getCacheDir().getPath();
File dir = new File(cacheDirectoryPath);
if (!dir.exists()) {
dir.mkdirs(); // 目录不存在就创建
}
// 文件保存
String filePath = cacheDirectoryPath + File.separator + "cutted.jpg";
File file = new File(filePath);
try {
FileOutputStream fos = new FileOutputStream(file);
//通过io流的方式来压缩保存图片
bmp.compress(Bitmap.CompressFormat.JPEG, 60, fos);
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意:由于安卓的乱象,启动剪裁时,某些手机中会报 ActivityNotFound 的异常。