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

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

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

附加选项如下:

选项 数据类型 描述
crop String 发送裁剪信号
aspectX int X方向上的比例
aspectY int Y方向上的比例
outputX int 裁剪区的宽
outputY int 裁剪区的高
scale boolean 是否保留比例
return-data boolean 是否将数据保留在Bitmap中返回
data Parcelable 相应的Bitmap数据
circleCrop String 圆形裁剪区域?
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传递数据是没问题的。

时间: 2024-08-06 20:18:48

Android图片裁剪解决方案 -- 从相册截图的相关文章

Android图片裁剪功能——调用系统裁剪

花了两天时间看了下android的图片裁剪功能的实现.其实刚开始做这个我挺虚的,以为整个功能都需要自己写出来,但查了些资料,发现android已经提供了裁剪功能,需要的话自己调用就成了.soga,这下轻松多了. 首先推荐几篇博客 Android大图片裁剪终极解决方案 要想弄明白裁剪功能,这系列博客非常重要,你可以不看我下面总结的,但你一定要看他这系列的几篇文章. Android 图片裁剪功能实现详解(类似QQ自定义头像裁剪) 这篇也不错,比较喜欢他的注释.虽然也有些误导,比如说他有一段对setD

Android图片裁剪实现(EnjoyCrop)

Android裁剪功能实现 概述 从4月初到5月份 ,差不多一个多月,终于把裁剪图片的功能码出来了,期间,解决了一个又来一个问题,好吧,问题总是会有的. 这里大致介绍这个裁剪功能技术点.主要难点,实现原理. 技术点 图片缩放.移动 裁剪区域预览 裁剪(包括越图片边界裁剪) 边界限制 主要难点 裁剪区域预览 裁剪 边界限制 实现原理 裁剪预览区域的实现 在我做过的项目中,就有使用过一些网络上开源的裁剪功能:半透明遮罩层的矩形预览框功能.它的实现原理是在裁剪预览区域外的地方填充了几个半透明的矩形框,

Android图片裁剪之自由裁剪

我的博客http://blog.csdn.net/dawn_moon 客户的需求都是非常怪的.我有时候在给客户做项目的时候就想骂客户是sb.可是请你相信我,等你有需求,自己变成客户的时候,给你做项目的哥哥肯定也会骂你是sb. 是这种,客户须要做一个图片上传的功能,这个图片须要裁剪.一般而言,这东西用系统自带的裁剪就搞定了.但是客户不,他要能够自由裁剪,就是长宽比不固定,想裁成什么比例就裁成什么比例,我一听,蛋都碎了. 没有办法,客户sb归sb,需求还是得照做,不然不给钱要喝西北风了. 图片裁剪的

移动端图片裁剪解决方案

1.需求 移动端头像裁剪功能 2.解决方案 使用jq和jcrop插件完成 3.解决思路 先把可移动的层的左上角左边和长宽传到后端,后端获得这些数据之后用gd库的函数去裁剪服务端的图片. 默认要裁剪的图片已经上传到后台,图片上传的解决方案这下面链接 http://www.cnblogs.com/norm/p/6188318.html 4.具体代码 a.引入类库 <link rel="stylesheet" href="css/jquery.Jcrop.css"&

Android图片裁剪——自定义裁剪工具

上次弄完调用系统裁剪之后,我又试着做一个自定义的裁剪工具. 老习惯,文章开始前还是先把我参考的资料贴出来.您愿意节省点时间看别人的更好的就直接从下面链接跳走-愿意看看我怎么做的那就先谢谢了! GitHub上老外做的一个非常棒的demo,代码也很漂亮 android自定义view实现裁剪图片功能,不使用系统的 第一个链接代码写的太好了,不过很多我用不上,也不需要那么麻烦的文件结构:第二个代码比较简单,但有些地方还是有借鉴意义的. 下面是我的代码,时间紧,就先不写太详细了: 注意几点: 我是在平板上

android图片裁剪截取中间正方形部分

在做相册应用的过程中,需要得到一个压缩过的缩略图但,同时我还希望得到的bitmap能够是正方形的,以适应正方形的imageView,传统设置inSampleSize压缩比率的方式只是压缩了整张图片,如果一个图片的长宽差距较大,则展示出来的时候会有拉伸的现象,因此正确的做法是在压缩之后,对bitmap进行裁剪. 代码如下: 给定图片维持宽高比缩放后,截取正中间的正方形部分 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Android 图片裁剪

参考文章: http://www.linuxidc.com/Linux/2012-11/73939p2.htm http://www.linuxidc.com/Linux/2012-11/73940p3.htm http://blog.csdn.net/yzwlord/article/details/8274131 http://blog.csdn.net/floodingfire/article/details/8144617

Android大图片裁剪终极解决方案 原理分析

约几个月前,我正为公司的APP在Android手机上实现拍照截图而烦恼不已. 上网搜索,确实有不少的例子,大多都是抄来抄去,而且水平多半处于demo的样子,可以用来讲解知识点,但是一碰到实际项目,就漏洞百出. 当时我用大众化的解决方案,暂时性的做了一个拍照截图的功能,似乎看起来很不错.问题随之而来,我用的是小米手机,在别的手机上都运行正常,小米这里却总是碰钉子.虽然我是个理性的米粉,但是也暗地里把小米的工程师问候了个遍.真是惭愧! 翻文档也找不出个答案来,我一直对com.android.came

Android大图片裁剪之手机拍照和从相册中选择注意点

Intent("com.android.camera.action.CROP"):中data.MediaStore.EXTRA_OUTPUT以及return-data data:Parcelable类型 传入的数据类型 MediaStore.EXTRA_OUTPUT:Uri类型 自定义裁切输出的图片存储位置 return-data:boolean类型 是否有返回数据(有返回值,返回Bitmap,没有返回值是因为使用Uri与File相似,所有的操作如裁剪将数据都保存在了Uri中,已经持有