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携带信息的不靠谱所造成的吃饭不香。那么具体怎样使用呢——
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case RESULT_CANCELED:
ToastUtil.showCenter(R.string.cancel);
return;
case 111://获取到图片后发送的requestCode,然后现在开始剪切
if (USER_ICON.exists()){
photoClip(Uri.fromFile(USER_ICON), 1, this);
}
break;
case 1://剪切成功后的返回
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(tempPhotoUri));
//取出bitmap即可
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
public void photoClip(Uri uri, int requestCode, Activity a) {
Intent intent = new Intent();//调用系统自带的图片裁剪
intent.setAction("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");//设置在开启的Intent中设置显示的VIEW可裁剪
intent.putExtra("aspectX", 16);//宽高比
intent.putExtra("aspectY", 9);
intent.putExtra("outputX", 1080);
intent.putExtra("outputY", 720);
intent.putExtra("return-data", false);//return置为false,获取截图保存的uri
intent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri());
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
a.startActivityForResult(intent, requestCode);
}
Uri tempPhotoUri;
private Uri getTempUri() {
tempPhotoUri = Uri.fromFile(getTempFile());
return tempPhotoUri;
}
private File getTempFile() {
if (FileUtils.envIsOk) {//这里只是个判断SD卡有效的方法
String dir = FileUtils.strSDPath + FileUtils.appName + FileUtils.BMP;
FileUtils.createDir(dir);
File f = new File(dir,"temp.jpg");
try {
f.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
return f;
}
return null;
}
附上裁剪属性表:
| 附加选项 | 数据类型 | 描述 |
| 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
android调用系统的自定义裁剪后得到的图片不清晰,使用MediaStore.EXTRA_OUTPUT获取缓存下的清晰图片的更多相关文章
- Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理 ...
- Android调用系统相机、自己定义相机、处理大图片
Android调用系统相机和自己定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,而且因为涉及到要把拍到的照片显示出来,该样例也会涉及到Android载入大图片时候的处 ...
- Android 调用系统分享文字、图片、文件,可直达微信、朋友圈、QQ、QQ空间、微博
原文:Android 调用系统分享文字.图片.文件,可直达微信.朋友圈.QQ.QQ空间.微博 兼容SDK 18以上的系统,直接调用系统分享功能,分享文本.图片.文件到第三方APP,如:微信.QQ.微博 ...
- Android调用系统相册和拍照的Demo
最近我在群里看到有好几个人在交流说现在网上的一些Android调用系统相册和拍照的demo都有bug,有问题,没有一个完整的.确实是,我记得一个月前,我一同学也遇到了这样的问题,在低版本的系统中没问题 ...
- Android调用系统拍照裁剪和选图功能
最近项目中用到修改用户头像的功能,基本上都是模板代码,现在简单记录一下. 调用系统拍照 private fun openCamera() { //调用相机拍照 // 创建File对象,用于存储拍照后的 ...
- Android调用系统相机以及自定义相机
0.综述 自定义相机,此处展示简单的相机功能,官方文档中还有相应关于视频拍摄的内容,此处不提 1.添加权限 <!--相机权限,数据存储--> <uses-permission and ...
- android调用系统相机并获取图片
如果不是特别的要求,通过拍照的方式取得图片的话,我们一般调用系统的拍照来完成这项工作,而没必要再自己去实现一个拍照功能.调用系统相机很简单,只需要一个intent就可以跳转到相几界面,然后再通过onA ...
- Android调用系统照相机
ndroid调用系统相机实现拍照功能 在实现拍照的功能时遇到了很多问题,搜索了很多资料,尝试了很多办法,终于解决了,下面简要的描述下在开发过程中遇到的问题. 虽然之前看过android开发的书,但是没 ...
- android 调用系统界面
现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下. 首先,我们先看拨号界面,代码如下: Intent intent =new Intent(); intent. ...
随机推荐
- struts2:OGNL表达式之#、%、$符号运用
1. OGNL表达达符号"#" 1.1 #用于访问OGNL上下文和Action上下文,#相当于ActionContext.getContext() 注意:当系统创建了Action实 ...
- 史上最全PHP正则表达式实例汇总
收集了一份php正则表达式的实例教程,真心不错,记录下. 正则表达式用于字符串处理.表单验证等场合,实用高效. 一些常用的表达式: $str = preg_replace("/(<a. ...
- DDR3控制
很简单的,app_en和app_rdy一握手,代表MIG接受了一个写数据请求或者读数据请求,只要保证app_en和app_rdy握手,根本就不关心写数据rdy,这是MIG的一个bug,你看它源码就知道 ...
- [sql]mysql指引(整理中...)-对db的分类
参考 db存储及分层 一个db一个文件夹. 一张表两个文件frm是存表结构的,ibd是存数据的 连接层: sock ip sql层: 存储层: 2018年4月1日 20:53:54小结: 时间太久,抓 ...
- openssl生成SSL证书的流程
SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secure socketlayer(SSL),SSL安全协议主要用来提供对用户和服务器的认证:对传送的数据进行加密和隐藏:确保数 ...
- [Windows Azure] What is Windows Azure Active Directory?
What is Windows Azure Active Directory? Windows Azure Active Directory is a service that provides id ...
- 每日英语:How the College Bubble Will Pop
The American political class has long held that higher education is vital to individual and national ...
- OSSIM架构与组成综述
OSSIM布道师 李晨光 一.背景 如果运维工程师手里没有高效的管理工具支持,就很难快速处理故障.市面上有很多运维监控工具,例如商业版的 Solarwinds.ManageEngine以及WhatsU ...
- Linux: grep多个关键字“与”和“或”
1.或操作 grep -E '123|abc' filename // 找出文件(filename)中包含123或者包含abc的行 egrep '123|abc' filename // 用egrep ...
- 关于dubbo的provider和consumer都配置timeout超时时间的情况
本文转自:http://blog.csdn.net/lkforce/article/details/54380201 前言 在dubbo的provider和consumer的配置文件中,如果都配置了t ...