《Android相机、相册获取图片显示并保存到SD卡》中说明了在直接调用Android相机拍照时返回Bitmap所引发的一个问题。今天,把在上篇附上的Demo加强了一下,增加了截图的功能。具体需求是:拍照或相册选取完毕后,先进入系统裁剪界面,裁剪完毕后再显示或保存图片,下面看下截图部分所要调用的代码:

[java] view plaincopy

 

 
  1. //截取图片
  2.     public void cropImage(Uri uri, int outputX, int outputY, int requestCode){
  3.         //裁剪图片意图
  4.         Intent intent = new Intent("com.android.camera.action.CROP");
  5.         intent.setDataAndType(uri, "image/*");
  6.         intent.putExtra("crop""true");
  7.         //裁剪框的比例,1:1
  8.         intent.putExtra("aspectX"1);
  9.         intent.putExtra("aspectY"1);
  10.         //裁剪后输出图片的尺寸大小
  11.         intent.putExtra("outputX", outputX);
  12.         intent.putExtra("outputY", outputY);
  13.         //图片格式
  14.         intent.putExtra("outputFormat""JPEG");
  15.         intent.putExtra("noFaceDetection"true);
  16.         intent.putExtra("return-data"true);
  17.         startActivityForResult(intent, requestCode);
  18.     }

例如,从相册选择图片后先调用裁剪功能代码如下:

[java] view plaincopy

 

 
  1. Intent openAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT);
  2. openAlbumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
  3. startActivityForResult(openAlbumIntent, REQUEST_CODE);

接下来在onActivityResult里面对裁剪后的图片进行处理,调用上面的cropImage()方法,将URI传入,500是指定裁剪后图片的尺寸,最后一个参数为标识码:

[java] view plaincopy

 

 
  1. Uri uri = data.getData();
  2. cropImage(uri, 500500, CROP_PICTURE);

处理裁剪后的图片就和之前一样,这里只贴出代码片段仅供参考:

[java] view plaincopy

 

 
  1. case CROP_PICTURE:
  2.     Bitmap photo = null;
  3.     Uri photoUri = data.getData();
  4.     if (photoUri != null) {
  5.          photo = BitmapFactory.decodeFile(photoUri.getPath());
  6.     }
  7.     if (photo == null) {
  8.         Bundle extra = data.getExtras();
  9.         if (extra != null) {
  10.              photo = (Bitmap)extra.get("data");
  11.              ByteArrayOutputStream stream = new ByteArrayOutputStream();
  12.              photo.compress(Bitmap.CompressFormat.JPEG, 100, stream);
  13.         }
  14.     }
  15.     iv_image.setImageBitmap(photo);
  16. break;

在制作这个Demo中发现一个问题,由于在处理拍照显示和裁剪这个过程中,我采取的方法是先将拍照后的图片保存在SD卡,然后再取出来进行处理,直接拍照并显示没有出现问题,但在拍照后裁剪时,发现每次传入裁剪界面的图片都是之前第一次拍的,进入SD卡也检查了,存放的临时图片也确实是我刚拍摄的,但是显示的却始终是之前第一次拍的,这里迷惑到我了。索性没有去管了,先解决问题再说(希望发现这个问题的朋友能提出改进方法)。既然在裁剪时我传入的图片名字都一样,那干脆就换一个名字,所以我每次用System.currentTimeMillis()来作为临时图片文件名,显示或处理完成后,再将该临时文件删除。Demo中还附上了一个关于图片和SD卡操作的工具类ImageTools.java作为赠品。最后功能还是实现了,但是还有很大的优化空间。先提出问题,感兴趣的同学可以下载Demo并改进,后续我会继续整理一些Demo然后开源到Github上,欢迎大家持续支持、改进。

界面截图:(相册选取时,选择的是小弟半裸球场照大笑

               

附上Demo下载地址:点击下载

作为辛苦劳动成果,设置了3分的下载小费,没分的同学可以想办法获取积分,好的社区需要大家一同建设,杜绝伸手党!

加入我们的QQ群或微信公众账号请查看:Ryan's zone公众账号及QQ群

觉得文章对你有用,点击右下角的转发按钮分享给更多人!

同时欢迎关注我的新浪微博和我交流:@唐韧_Ryan

 

原文链接http://blog.csdn.net/ryantang03/article/details/8656278

arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()