Android裁剪图片总结

在网上搜索了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,效果图如下:

Android裁剪图片总结_第1张图片    Android裁剪图片总结_第2张图片  Android裁剪图片总结_第3张图片

Android裁剪图片总结_第4张图片    Android裁剪图片总结_第5张图片    Android裁剪图片总结_第6张图片

在我的魅族魅蓝note上测试,是没有问题的,其他机型和系统没测试,结果可能会有出入。

源代码放在下面了,是AndroidStudio工程。

源代码下载点击这里

你可能感兴趣的:(Android)