在网上搜索了Android裁剪图片的方式,发现有两种:
1、裁剪后返回的不是Intent中指定尺寸的图,而是缩略图
2、裁剪后返回的是指定大小的图片
关于这两种裁剪方式,我把自己试验后的结果记录如下:
1、裁剪成缩略图模式,步骤如下:
(1)先通过Intent选择图片,获取图片URI,代码如下:
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, 300);
(2)在onActivityResult中获取选中的图片的URI,代码如下:
Uri uri = data.getData();
(3)获取URI之后,通过Intent裁剪图片,代码如下:
private void cropImage(Uri uri) {
if(uri == null){
return;
}
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 500);
intent.putExtra("outputY", 500);
intent.putExtra("return-data", true);
startActivityForResult(intent, 100);
}
(4)在onActivityResult中接收返回的裁剪后的bitmap,代码如下:
Bitmap bm = data.getParcelableExtra("data");
if(bm != null){
imageView.setImageBitmap(bm);
}else{
Toast.makeText(this, "bitmap == null", Toast.LENGTH_SHORT).show();
}
上面的4步就是裁剪图片返回缩略图的代码,虽然在第三步中,我们在Intent中指定了outputX和outputY的值为500,但是在第四步中返回的bitmap的宽高却不一定是500,我在魅族魅蓝note(系统是Android4.4)上测试,结果返回的bitmap长宽都是177,但是在Android模拟器(系统是Android5.1)上测试,返回的确是我们指定的大小。
2、裁剪图片返回指定的大小而不是缩略图
这种裁剪方法的思路是,通过URI将裁剪的图片按我们指定的大小保存到文件中,步骤如下:
(1)用Intent选择图片,代码如下:
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, REQ_CODE_SELECT_PIC);
(2)在onActivityResult中获取选择的图片的URI,代码如下:
Uri uri = data.getData();
(3)开始裁剪图片,并将裁剪后的数据保存到文件中,代码如下:
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 600);
intent.putExtra("outputY", 600);
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
startActivityForResult(intent, REQ_CODE_CROP);
上面的代码需要注意的是,return-data我们设置了false,表示裁剪后的图片不用bitmap的形式返回,而是通过URI存到文件中,另外,intent中给MediaStore.EXTRA_OUTPUT属性设置了一个tempUri,这个URI就代表裁剪后的图片保存的文件,tempUri的初始化代码如下:
tempFile = new File(tempDir + File.separator + System.currentTimeMillis() + ".jpg");
tempUri = Uri.fromFile(tempFile);
(4)在onActivityResult中处理数据。经过第三步之后,裁剪完成的图片就保存到tempUri对应的文件中了,这个文件里的图片,是按照我们设置的裁剪大小保存的,而不是缩略图的形式,所以我们显示裁剪后的图片,就可以直接从文件里读取数据了,onActivityResult中的代码如下所示:
Bitmap bm = BitmapFactory.decodeFile(tempFile.getAbsolutePath());
imageView.setImageBitmap(bm);
其中的tempFile,是在初始化tempUri的时候新建的文件
3、裁剪图片的demo
根据前面记录的两种裁剪图片的方式,我写了一个demo,效果图如下:
在我的魅族魅蓝note上测试,是没有问题的,其他机型和系统没测试,结果可能会有出入。
源代码放在下面了,是AndroidStudio工程。
源代码下载点击这里