【SKILLS】Android图片裁剪方案

来源:互联网 发布:网络存储器是什么 编辑:程序博客网 时间:2024/04/28 21:20

准备开个系列文章,积累自己在Android开发过程中所学习到的一些小skills,大体上会是关于某个小的技术问题或应用场景的一些解决方案或思路,也欢迎大家在这里留言说下自己的心得。

这一次来看个小的应用场景——Android应用中图片裁剪,如果你的应用是需要用户来生成内容,那么很有可能会用到这项技术,因为很多时候需要支持头像上传。细心的开发者会发现,从不同手机设备中上传的图片方向会乱七八糟,本来在手机上看原图人是垂直朝下的,上传到服务器后图片就颠倒了,特别在用相机拍照上传时会经常发生。另外,上传图片大小的不规范也会令开发者很头疼,使得我们需要额外的功夫来改善这种状况。因而,在上传前对图像进行编辑显得很有必要,在某种程度上能够降低开发者的工作量。

现在来看看都有哪些方案能够有效地实现图片裁剪?

1. Android原生支持(最简单的方案,仅支持图片的裁剪,适应较低质量图片

指定待裁剪图片的Uri,启动图片裁剪的Activity:

         Intent intent = new Intent ("com.android.camera.action.CROP" );         intent . setDataAndType( uri , "image/*" );         // 设置裁剪         intent . putExtra( "crop" , "true" );         // aspectX aspectY 是宽高的比例         intent . putExtra( "aspectX" , 1 );         intent . putExtra( "aspectY" , 1 );          // outputX outputY 是裁剪图片宽高         intent . putExtra( "outputX" , 320 );         intent . putExtra( "outputY" , 320 );         intent . putExtra( "return-data" , true );         startActivityForResult ( intent, REQ_CUT_HEAD);
uri是待裁剪的图片的Uri,REQ_CUT_HEAD为自定义的requestCode。在onActivityResult中获取裁剪后的图片:

    @Override    protected void onActivityResult( int requestCode , int resultCode, Intent data ) {        switch (requestCode ) {       case REQ_CUT_HEAD:          if ( data != null ) {              Bundle extras = data .getExtras ();              if ( extras != null ) {                  Bitmap photo = extras. getParcelable( "data" );                  if ( photo == null ) {                     ...                  }                  ...              }          }          break ;             default :               }    }
我们看到裁剪后的图片是以Bitmap的形式返回,由于Intent传递数据有大小限制(数据大于限制时会报TransactionTooLargeException),所以返回的Bitmap很有可能是经过压缩的,这样图片的质量会大打折扣。

2. 开源方案(方便强大

在开源世界里有很多不错的解决方案,拿过来用可以提高开发效率。

Github上有一大把,搜"android crop"~~

我用了其中一个感觉还不错,链接地址为https://github.com/edmodo/cropper

它有一个demo,移植到项目中相当容易。这时候你不得不感叹这些人的伟大!~

这个开源项目除了能够做图片裁剪,还支持图片翻转~

3. DIY(自己动手丰衣足食

思路可以参考已有的开源项目~


附:

1. 怎样能够支持高质量的图片裁剪?

提供一种思路就是将裁剪后的图片保存下来,传递图片uri~

2. 从图片库获取图片代码段:

                 Intent intent = new Intent (MediaStore . ACTION_IMAGE_CAPTURE);                 intent . setAction( MediaStore .ACTION_IMAGE_CAPTURE );                  // mTakePhotoUri, you need to generate Uri yourself                 intent . putExtra( MediaStore .EXTRA_OUTPUT , mTakePhotoUri );                 startActivityForResult ( intent, REQ_TAKE_PHOTO);
3. 拍照获取图片代码段:

                 Intent intent = new Intent ();                 intent . setType( "image/*" );                 intent . setAction( Intent .ACTION_GET_CONTENT );                 intent . putExtra( "return-data" , true );                 startActivityForResult ( intent, REQ_PICK_PHOTO);
4. Bitmap -> Uri:

        private Uri getImageUri(Context context, Bitmap bitmap) {ByteArrayOutputStream bytes = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);String path = Images.Media.insertImage(context.getContentResolver(),bitmap, "Title", null);return Uri.parse(path);}

0 0
原创粉丝点击