Android图片裁剪解决方案 -- 从相册截图

本文介绍在Android开发中如何使用Intent实现从相册中选择并裁剪图片的功能。提供了两种接收截图数据的方法:一种是直接通过Intent返回数据;另一种是通过外部URI接收数据。同时还讨论了不同情况下的适用性。

在看Storage Access Framework,里面有一个加载相册图片的程序片断,可能是系统版本的问题,无法返回结果,这里找到一个适用于旧版本的方法。

 

在Android开发中,可以轻松调用一个Intent完成从相册中截图的工作:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType("image/*");
intent.putExtra("crop", "true");

附加选项如下:

选项数据类型描述
cropString发送裁剪信号
aspectXintX方向上的比例
aspectYintY方向上的比例
outputXint裁剪区的宽
outputYint裁剪区的高
scaleboolean是否保留比例
return-databoolean是否将数据保留在Bitmap中返回
dataParcelable相应的Bitmap数据
circleCropString圆形裁剪区域?
MediaStore.EXTRA_OUTPUT ("output")URI将URI指向相应的 file:///...

 

这个return-data是比较令人困惑的。

有两种方法接收截图数据:

方法一:把return-data设为true,让数据直接通过Intent返回到onActivityResult中,如下:

public void SelectSmallImg(View view){
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
        intent.setType("image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", 800);
        intent.putExtra("outputY", 800);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", true);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true); // no face detection
        startActivityForResult(intent, CHOOSE_SMALL_PICTURE);
    }

方法二:return-data设为false,利用MediaStore.EXTRA_OUTPUT标签,把数据存储在外部的临时URI,再由onActivityResult读取。当然了,要事先准备好一个指向文件的URI,如果有sdcard则问题不大,没有的话会怎样?????

public void SelectLargeImg(View view){
        // this is for android 4.4 ??
        //Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT,null);
        intent.setType("image/*");
        intent.putExtra("crop", true);
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        //intent.putExtra("outputX", 400);  //返回数据的时候的 X 像素大小。
        //intent.putExtra("outputY", 400);  //返回的时候 Y 的像素大小。
        intent.putExtra("scale", true);
        intent.putExtra("return-data", false);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true);
        startActivityForResult(intent,CHOOSE_BIG_PICTURE);
    }

在onActivityResult里可以这样对付:

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent resultData){
        switch(requestCode){
            case CHOOSE_BIG_PICTURE:
                if(resultCode == Activity.RESULT_OK && resultData != null){
                    Log.i(DEBUG_FLAG,imageUri.toString());
                    Bitmap bitmap = decodeUriAsBitmap(imageUri);//decode bitmap (自己写一个把URI转换为bitmap的函数)
                    if(bitmap == null){
                        Log.i(DEBUG_FLAG,"BIG_PICTURE NULL");
                    }else{
                        imageView.setImageBitmap(bitmap);
                        Log.i(DEBUG_FLAG , "Size:"+bitmap.getWidth()+" X "+bitmap.getHeight());
                    }
                    
                }
                break;
            case CHOOSE_SMALL_PICTURE:
                if(resultCode == Activity.RESULT_OK && resultData != null){
                    Bitmap bitmap = resultData.getParcelableExtra("data");
                    if(bitmap == null){
                        Log.i(DEBUG_FLAG,"SMALL_PICTURE NULL");
                    }else{
                        imageView.setImageBitmap(bitmap);
                        Log.i(DEBUG_FLAG , "Size:"+bitmap.getWidth()+" X "+bitmap.getHeight());
                    }
                }
                break;
            default :
                break;
        }
    }

自己写一个把URI转换为bitmap的函数:

Bitmap decodeUriAsBitmap(Uri uri){
            Bitmap bitmap = null;
            try {
                bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                return null;
            }
            return bitmap;
    }

============================

总结一下:基于内存的考虑,在图片较大时,android的截图功能会返回一个160*160的缩略图,这样就只能通过外部URI来接收数据,如果是小图,直接用Intent传递数据是没问题的。

 

本文大部分参考:http://blog.youkuaiyun.com/floodingfire/article/details/8144615

API指南中的Storage Access Framework是基于API4.4的版本,里面的最后部分有一个关于自定义Document Provider的构建,这里也要记录一下。(例如是自己实现的云存储)

 

 

 

 

转载于:https://www.cnblogs.com/myjhaha/p/4427922.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值