android调用系统的自定义裁剪后得到的图片不清晰,使用MediaStore.EXTRA_OUTPUT获取缓存下的清晰图片
在使用系统自带的剪切图片工具时,通常只能设置一些比较小的值,像
intent.putExtra("outputX", 320);
intent.putExtra("outputY", 320);
剪切后图片的尺寸不能设置为过大,经测试到480就会出现卡住的现象,为什么呢?
原因是在于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就是指定的保存地址。
利用MediaStore.EXTRA_OUTPUT,就可以规避Intent携带信息的不靠谱所造成的吃饭不香。那么具体怎样使用呢——
1 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 2 3 switch (requestCode){ 4 case RESULT_CANCELED: 5 ToastUtil.showCenter(R.string.cancel); 6 return; 7 case 111://获取到图片后发送的requestCode,然后现在开始剪切 8 if (USER_ICON.exists()){ 9 photoClip(Uri.fromFile(USER_ICON), 1, this); 10 11 } 12 break; 13 14 case 1://剪切成功后的返回 15 Bitmap bitmap = null; 16 try { 17 bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(tempPhotoUri)); 18 //取出bitmap即可 19 break; 20 21 } 22 super.onActivityResult(requestCode, resultCode, data); 23 } 24 25 public void photoClip(Uri uri, int requestCode, Activity a) { 26 Intent intent = new Intent();//调用系统自带的图片裁剪 27 intent.setAction("com.android.camera.action.CROP"); 28 intent.setDataAndType(uri, "image/*"); 29 intent.putExtra("crop", "true");//设置在开启的Intent中设置显示的VIEW可裁剪 30 intent.putExtra("aspectX", 16);//宽高比 31 intent.putExtra("aspectY", 9); 32 intent.putExtra("outputX", 1080); 33 intent.putExtra("outputY", 720); 34 intent.putExtra("return-data", false);//return置为false,获取截图保存的uri 35 intent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri()); 36 intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); 37 intent.putExtra("noFaceDetection", true); 38 a.startActivityForResult(intent, requestCode); 39 } 40 41 Uri tempPhotoUri; 42 private Uri getTempUri() { 43 tempPhotoUri = Uri.fromFile(getTempFile()); 44 return tempPhotoUri; 45 } 46 47 private File getTempFile() { 48 if (FileUtils.envIsOk) {//这里只是个判断SD卡有效的方法 49 String dir = FileUtils.strSDPath + FileUtils.appName + FileUtils.BMP; 50 FileUtils.createDir(dir); 51 File f = new File(dir,"temp.jpg"); 52 try { 53 f.createNewFile(); 54 } catch (IOException e) { 55 e.printStackTrace(); 56 } 57 return f; 58 } 59 return null; 60 }
附上裁剪属性表:
附加选项 | 数据类型 | 描述 |
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 | 是否取消人脸识别功能 |
参考:http://blog.csdn.net/augusaccount/article/details/54890169
http://www.cppblog.com/ctou45/archive/2013/02/20/197947.aspx