Android实现读取相机(相册)图片并进行剪裁
来源:互联网 发布:淘宝助理csv文件制作 编辑:程序博客网 时间:2024/05/29 17:56
转自:http://www.jb51.net/article/70671.htm
在 Android应用中,很多时候我们需要实现上传图片,或者直接调用手机上的拍照功能拍照处理然后直接显示并上传功能,下面将讲述调用相机拍照处理图片然后显示和调用手机相册中的图片处理然后显示的功能
我们先说一下思路,在android系统中就自带了图片剪切的应用,所以,我们只需要将我们获取到的相片传给图片剪切应用,再将剪切好的相片返回到我们自己的界面显示就ok了
在开发一些APP的过程中,我们可能涉及到头像的处理,比如从手机或者相册获取头像,剪裁成自己需要的头像,设置或上传头像等。网上一些相关的资料也是多不胜数,但在实际应用中往往会存在各种问题,没有一个完美的解决方案。由于近期项目的需求,就研究了一下,目前看来还没有什么问题。
这里我们只讨论获取、剪裁与设置,上传流程根据自己的业务需求添加。先上一张流程图:
这图是用Google Drive的绘图工具绘制的,不得不赞叹Google可以把在线编辑工具做得如此强大。好吧,我就是Google的脑残粉!回到主题,这是我设计的思路,接下来进行详细分析:
1、获得图片的途径无非就两种,第一是相机拍摄,第二是从本地相册获取。
2、我在SD卡上创建了一个文件夹,里面有两个Uri,一个是用于保存拍照时获得的原始图片,一个是保存剪裁后的图片。之前我考虑过用同一个Uri来保存图片,但是在实践中遇到一个问题,当拍照后不进行剪裁,那么下次从SD卡拿到就是拍照保存的大图,不仅丢失了之前剪裁的图片,还会因为加载大图导致内存崩溃。基于此考虑,我选择了两个Uri来分别保存图片。
3、相机拍摄时,我们使用Intent调用系统相机,并将设置输出设置到SDCard\xx\photo_file.jpg,以下是代码片段:
在回调时,我们需要对photo_file.jpg调用系统工具进行剪裁,并设置输出设置到SDCard\xx\crop_file.jpg,以下是代码片段:
最后,我们需要在回调中取出crop_file.jpg,因为剪裁时,对图片已经进行了压缩,所以也不用担心内存的问题,在这里我提供两个方法,第一个是直接获取原始图片的Bitmap,第二个是获取原始图片并做成圆形,相信大多数的人对后者比较感兴趣,哈哈!以下是代码片段:
4、相册获取时,这也是最难的地方。Android 4.4以下的版本,从相册获取的图片Uri能够完美调用系统剪裁工具,或者直接从选取相册是带入剪裁图片的Intent,而且效果非常完美。但是在Android 4.4及其以上的版本,获取到的Uri根本无法调用系统剪裁工具,会直接导致程序崩溃。我也是研究了很久,才发现两者的Uri有很大的区别,Google官方文档中让开发者使用Intent.ACTION_GET_CONTENT代替以前的Action,并且就算你仍然使用以前的Action,都会返回一种新型的Uri,我个人猜测是因为Google把所有的内容获取分享做成一个统一的Uri,如有不对,请指正!想通这一点后,问题就变得简单了,我把这种新型的Uri重新封装一次,得到以为"file:\\..."标准的绝对路劲,传入系统剪裁工具中,果然成功了,只是这个封装过程及其艰难,查阅了很多资料,终于还是拿到了。下面说下具体步骤:
第一、调用系统相册,以下是代码片段:
第二、在回调中,重新封装Uri,并调用系统剪裁工具将输出设置到crop_file.jpg,调用系统剪裁工具代码在拍照获取的步骤中已经贴出,这里就不重复制造车轮了,重点贴重新封装Uri的代码,以下是代码片段:
后续的系统剪裁工具调用跟拍照获取步骤一致,请参见上的代码。
5、所有步骤完成,在Nexus 5设备中的最新系统中测试通过,在小米、三星等一些设备中表现也很完美。如果在你的设备上存在缺陷,一定要跟帖给我反馈,谢谢!
文章结尾附上一个网友的完整示例,给了我很多的参考
最后再啰嗦一句,功能虽然已经实现了,但是实际代码还是可以进一步优化的,感兴趣的童鞋们可以改进下。
- Android实现读取相机(相册)图片并进行剪裁
- 从相册,相机拍照,并对图片进行剪裁
- android 获取相册图片和使用相机照照片 并使用Android自带图片剪裁界面剪裁
- iOS 调取本地相册/相机,剪裁图片进行头像上传
- android 用相机照相并剪裁图片
- Android选取相机、相册图片进行裁剪,并更新UI
- 从相机(相册)获取图片并剪裁的最佳实践
- 调用系统相机、相册、剪裁图片并上传(常用于上传头像,兼容Android7.0)
- 调用系统相机、相册、剪裁图片并上传(常用于上传头像,兼容Android7.0)
- Android开发基础 调用相机 系统相册(并对图片进行压缩处理)
- Android选择图片(从相册或相机)并裁剪
- Android调用相机实现拍照并裁剪图片,调用手机中的相册图片并裁剪图片
- Android中拍照和从相册选择图片,并对选择的图片进行剪裁的例子
- Android打开系统相机、相册,并进行裁剪图片的工具类CameraUtil,以及相册获取图片注意要点。
- Android中拍照和从相册选择图片,并剪裁(二)
- Android中拍照和从相册选择图片,并剪裁(二)
- 【Android】使用系统相机或者从相册中获取图片资源并进行适当裁剪
- android打开相册选取图片或打开相机拍照并进行裁剪
- android中popupwindow弹出后,屏幕背景变成半透明
- Context.getExternalFilesDir()和Context.getExternalCacheDir()方法
- C++PRIMER 学习笔记
- 关于makefile
- GDI+双缓冲
- Android实现读取相机(相册)图片并进行剪裁
- JFinal学习--04Handler
- css3之渐变
- Qt 解析网络数据出现ssl错误
- Linux 安装 mysql
- iOS UITableCell复用
- 关于mysql使用mysqlbinlog恢复被删除的数据的问题
- gulp详细入门教程
- Extreme Learning Machine的Java源码配置