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           }

附上裁剪属性表:

 

附加选项数据类型描述
cropString发送裁剪信号
aspectXintX方向上的比例
aspectYintY方向上的比例
outputXint裁剪区的宽
outputYint裁剪区的高
scaleboolean是否保留比例
return-databoolean是否将数据保留在Bitmap中返回
dataParcelable相应的Bitmap数据
circleCropString圆形裁剪区域?
MediaStore.EXTRA_OUTPUT ("output")URI将URI指向相应的file:///...,详见代码示例
outputFormatString输出格式,一般设为Bitmap格式:Bitmap.CompressFormat.JPEG.toString()
noFaceDetectionboolean是否取消人脸识别功能

 

参考:http://blog.csdn.net/augusaccount/article/details/54890169

  http://www.cppblog.com/ctou45/archive/2013/02/20/197947.aspx

 

转载于:https://www.cnblogs.com/Sharley/p/8308710.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值