Android上从相册选择后剪裁图片
现在带用户功能的APP基本都要做一个带头像剪裁上传的功能,主要步骤如下:
- 1.打开系统相册
- 2.选择好图片,通过onActivityResult获得图片
- 3.打开剪裁activity,把选择好的照片传进去
- 4.处理剪裁好的图片
1.打开系统相册
/**
*CODE_GALLERY_REQUEST 请求识别码
*/
private static final int CODE_GALLERY_REQUEST = 0xa0;
public void openGallery() {
Intent pickIntent;
if (android.os.Build.VERSION.SDK_INT >= 19) {
// 判断是不是4.4系统,不同的系统用了不同的action
pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
} else {
pickIntent = new Intent(Intent.ACTION_GET_CONTENT);
}
// 如果要限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型"
pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(pickIntent, CODE_GALLERY_REQUEST);
}
2.获得选好的图片
这个时候我们应该就选好图片了,去onActivityResult里拿到图片
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case CODE_GALLERY_REQUEST:// 直接从相册获取的图片
try {
cropRawPhoto(data.getData());
} catch (NullPointerException e) {
e.printStackTrace();// 用户点击取消操作
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
3.打开剪裁activity
private static final int CODE_CROP_REQUEST = 0xa2;
private static int output_X = 480;
private static int output_Y = 480;
private Uri templeUri;
private String path, userName="joeys";
public void cropRawPhoto(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
//将选好的图片传进去
intent.setDataAndType(uri, "image/*");
// 设置裁剪
intent.putExtra("crop", "true");
// aspectX , aspectY :宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX , outputY : 裁剪图片宽高
intent.putExtra("outputX", output_X);
intent.putExtra("outputY", output_Y);
//创建一个新的文件,用来存放我们的剪裁好的图片
path = createAvatarPath(userName);
//将刚才创建好的文件路径转化为uri。ps(这样做的好处大大的有,因为别的方法你会坑爹的发现在小米手机上用不了,剪裁后就崩溃或者activity直接关闭,得不到我们剪裁好的图片,但是这样就不会了)
templeUri = Uri.parse("file://" + path);
//让系统将剪裁好的图片存入我们创建的文件
intent.putExtra(MediaStore.EXTRA_OUTPUT, templeUri);
//将剪裁好的图片输出格式设为png,和我们之前创建的文件的后缀名一致
intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
startActivityForResult(intent, CODE_CROP_REQUEST);
}
创建头像的文件的方法:
public static final String AVATAR_DIR = "sdcard/avatar/";
public static String createAvatarPath(String userName) {
String dir = AVATAR_DIR;
File destDir = new File(dir);
if (!destDir.exists()) {
//如果这个文件夹不存在,就创建一个
destDir.mkdirs();
}
File file;
if (userName != null) {
//这里注意一下,如果我们创建的文件重名,新的文件就会覆盖掉原来的文件
file = new File(dir, userName + ".png");
} else {
file = new File(dir, new DateFormat().format("yyyy_MMdd_hhmmss",
Calendar.getInstance(Locale.CHINA)) + ".png");
}
return file.getAbsolutePath();
}
4.处理裁好的图片
这就简单了,我们在onActivityResult里,通过templeUri拿到bitmap,另外图片的path我们也知道,然后要杀要剐随你便。。
if (requestCode == CODE_CROP_REQUEST) {
try {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(templeUri));
imageview.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
至此我们的图片选择与剪裁大功告成,enjoy~