1.图片获取
Android相机、相册获取图片在本地组件显示(或者上传至服务器),实现可以在Activity中通过如下代码可以启动相机,然后在重写的onActivityResult方法中可以获取到返回的照片数据:
这种方式在onActivityResult方法里通过Intent的getData方法获取的数据转换成bitmap并显示在界面上,有时候会有取不到数据,或者显示的bitmap会非常小,如果将bitmap保存到sd卡后会发现,图片的分辨率很低,并且图片大小也是经过压缩的,不管将相机的像素设置多高,最后通过这种方式返回的bitmap总是经过压缩了的。如果想获得理想的照片大小和分辨率改如何处理呢?首先来简述一下为什么返回的图片是经过了压缩的。
Android系统分配给每个应用的默认最大内存是16M,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常。所以,系统为了防止应用内存占用过大,对于在应用内通过相机拍摄的图片最终返回来的结果进行了压缩,压缩后的图片变得很小,通过之前说的getData的方式只能满足比如显示个人头像这样的需求,如果要显示大图,就会出现模糊的情况。那如何获取清晰的大图呢?解决思路如下:
1.拍照时,将拍得的照片先保存在本地,通过修改之前的代码如下:
2.在onActivityResult方法中再将图片取出,并经过缩小处理再显示在界面上或上传给服务器(压缩比例自定义)
由于Android给bitmap分配的内存最大不超过8M,所以对使用完的较大的Bitmap要释放内存,调用其recycle()方法即可。然后将缩小后的bitmap显示在界面上或保存到SD卡,至于之前保存的原图,可以删掉,也可以不处理,因为同名文件下次操作会直接被覆盖掉。
以上是拍照获取图片,如果是从相册中获取图片又如何处理呢,方法如下:
1.打开相册选取图片
2.在onActivity方法中处理获取到的图片,思路和之前类似
2. 图片裁剪
拍照或相册选取完毕后,先进入系统裁剪界面,裁剪完毕后再显示或保存图片,下面看下截图部分所要调用的代码:
例如,从相册选择图片后先调用裁剪功能代码如下:
接下来在onActivityResult里面对裁剪后的图片进行处理,调用上面的cropImage()方法,将URI传入,500是指定裁剪后图片的尺寸,最后一个参数为标识码:
处理裁剪后的图片就和之前一样:
附加说明
以上的文章整理自Ryan的博客,作为学习之用还是有一定的参考价值的,我个人在项目开发中使用的图像处理是jdamcd写的一个demo,代码结构和严谨易用性都是非常不错的。大家可以在github上下载学习。