在网上搜索了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工程。

源代码下载点击这里

更多相关文章

  1. android与Unity3D之间的相爱相杀
  2. Android(安卓)APK文件拆解方法
  3. Android(安卓)- 开发实例(16):ListView新的使用方式
  4. Android开发之CheckedBox背景图片设置问题
  5. Android(安卓)数据操作(一) 自定义AttributeSet属性
  6. android 根据屏幕大小自行选择图片
  7. Android(安卓)小项目之--解析如何获取SDCard 内存
  8. 通过PhoneGap在Android上去推送通知
  9. Android(安卓)Button 你真的会用吗(含福利)???

随机推荐

  1. Android(安卓)Notification
  2. Android 应用语言切换的三种方法
  3. android: 横竖屏切换总结-布局改变和数据
  4. android之五大布局
  5. 在 Android(安卓)中调用二进制可执行程序
  6. Android Location的使用
  7. 安卓巴士真诚送上营养丰富的精美Android
  8. Android屏幕适配出现的原因
  9. (五)Android线程及其消息机制
  10. Android——启动过程详解