转载自:http://blog.csdn.net/augusaccount/article/details/54890169
废话buduosh不多说,直接上代码,以下就是我测试出来的结果:
Intent intent = new Intent("com.android.camera.action.CROP"); //com.android.camera.action.CROP这个action是用来裁剪图片用的 intent.setDataAndType(uri, "image/*"); // 设置裁剪 intent.putExtra("crop", "true"); //aspectX,aspectY,outputX,outputY必须为int型,否则无效,项目中宽高比为1.6 // aspectX aspectY 是宽高的比例,没有化简是因为网上说aspectX aspectY一定要比outputX,outputY大,否则会闪退。 //但是实际测试中用的8:5也没有什么问题,但是为了保险起见还是用了800:500 intent.putExtra("aspectX", 800); intent.putExtra("aspectY", 500); // outputX outputY 是裁剪图片宽高 //清晰度够的情况下还是用360比较好 intent.putExtra("outputX", 360); intent.putExtra("outputY", 225); //480的比例会奔溃,因此440为上限了 // intent.putExtra("outputX", 480); // intent.putExtra("outputY", 300); // intent.putExtra("outputX", 440); // intent.putExtra("outputY", 275); intent.putExtra("return-data", true); startActivityForResult(intent, CROP_SMALL_PICTURE);
附上裁剪属性表:
附加选项 | 数据类型 | 描述 |
crop | String | 发送裁剪信号 |
aspectX | int | X方向上的比例 |
aspectY | int | Y方向上的比例 |
outputX | int | 裁剪区的宽 |
outputY | int | 裁剪区的高 |
scale | boolean | 是否保留比例 |
return-data | boolean | 是否将数据保留在Bitmap中返回 |
data | Parcelable | 相应的Bitmap数据 |
circleCrop | String | 圆形裁剪区域? |
MediaStore.EXTRA_OUTPUT ("output") | URI | 将URI指向相应的file:///...,详见代码示例 |
outputFormat | String | 输出格式,一般设为Bitmap格式:Bitmap.CompressFormat.JPEG.toString() |
noFaceDetection | boolean | 是否取消人脸识别功能 |
【注意】我们在使用剪切图片的时候,通常我们设置属性只能设置一些比较小的值,像intent.putExtra("outputX", 320);intent.putExtra("outputY", 320);剪切后图片的尺寸不能设置为过大,经测试到640就会出现卡住的现象,为什么呢?原因是在于Intent 的data域最大传递的值的大小约为1M,所以图片的BITMAP当超过1M时就会失败。通常我们只是设置头像可以用这个方法,那么如果我们要剪切显示一些比较大的图片呢?怎么做呢?
该方法就是先设置为return-data设为false,不从data域获取图片,而是越过这个桥梁,通过我们刚刚在剪切图片后设置的路径目录和名称来单独获取这个图片,就可以完美显示了。如果不设置return-data为false,那么就会默认通过data返回,从而造成卡住现像。
return-data:是将结果保存在data中返回,在onActivityResult中,直接调用intent.getdata()就可以获取值了,这里设为fase,就是不让它保存在data中
MediaStore.EXTRA_OUTPUT:由于我们不让它保存在Intent的data域中,但我们总要有地方来保存我们的图片,这个参数就是转移保存地址的,对应Value中保存的URI就是指定的保存地址。