Android大图片裁剪终极解决方案

根据我们的分析与总结,图片的来源有拍照和相册,而可采取的操作有

  • 使用Bitmap并返回数据
  • 使用Uri不返回数据

前面我们了解到,使用Bitmap有可能会导致图片过大,而不能返回实际大小的图片,我将采用大图Uri,小图Bitmap的数据存储方式。

我们将要使用到URI来保存拍照后的图片:

?


1

2

private static final String IMAGE_FILE_LOCATION = "file:///sdcard/temp.jpg";//temp file

Uri imageUri = Uri.parse(IMAGE_FILE_LOCATION);//The Uri to store the big bitmap

不难知道,我们从相册选取图片的Action为Intent.ACTION_GET_CONTENT。

根据我们上一篇博客的分析,我准备好了两个实例的Intent。

    一、从相册截大图:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);

intent.setType("image/*");

intent.putExtra("crop", "true");

intent.putExtra("aspectX", 2);

intent.putExtra("aspectY", 1);

intent.putExtra("outputX", 600);

intent.putExtra("outputY", 300);

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); // no face detection

startActivityForResult(intent, CHOOSE_BIG_PICTURE);

二、从相册截小图

?


1

2

3

4

5

6

7

8

9

10

11

12

Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);

intent.setType("image/*");

intent.putExtra("crop", "true");

intent.putExtra("aspectX", 2);

intent.putExtra("aspectY", 1);

intent.putExtra("outputX", 200);

intent.putExtra("outputY", 100);

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);

    三、对应的onActivityResult可以这样处理返回的数据

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

switch (requestCode) {

case CHOOSE_BIG_PICTURE:

    Log.d(TAG, "CHOOSE_BIG_PICTURE: data = " + data);//it seems to be null

    if(imageUri != null){

        Bitmap bitmap = decodeUriAsBitmap(imageUri);//decode bitmap

        imageView.setImageBitmap(bitmap);

    }

    break;

case CHOOSE_SMALL_PICTURE:

    if(data != null){

        Bitmap bitmap = data.getParcelableExtra("data");

        imageView.setImageBitmap(bitmap);

    }else{

        Log.e(TAG, "CHOOSE_SMALL_PICTURE: data = " + data);

    }

    break;

default:

    break;

}

?


1

2

3

4

5

6

7

8

9

10

private Bitmap decodeUriAsBitmap(Uri uri){

    Bitmap bitmap = null;

    try {

        bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));

    } catch (FileNotFoundException e) {

        e.printStackTrace();

        return null;

    }

    return bitmap;

}

    效果图:

大图 小图

转载(http://my.oschina.net/ryanhoo/blog/86853)

时间: 2024-10-14 18:54:39

Android大图片裁剪终极解决方案的相关文章

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中,已经持有

Android 大图片加载 避免OOM

文章来自郭大神:======= 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9316683 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/training/displaying-bitmaps/index.html 高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状.

Android 大图片预览ViewPager

项目gitHub地址:  https://github.com/bm-x/PhotoView 个人项目gitHub地址:  https://github.com/anan03/ananwork/tree/master/PhotoView PhotoView 图片浏览缩放控件 和普通的ImageView一样的使用方法 如使用过程中有任何bug,意见或建议,可邮件给我 [email protected] 效果图 注意 由于facebook的Fresco图片加载组件所加载出来的drawable图片并非

android开发图片分辨率问题解决方案

dpi是什么呢? dpi是“dot per inch”的缩写,每英寸像素数. 四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high) 一般情况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320. dpi计算公式 DPI=对角线的像素值/尺寸 手机屏幕分辨率和屏幕密度是两码事!并不是800*480的分辨率手机图片就应该放在hdpi文件夹中.5.0英寸 800*480属于mdpi

android sdk更新的终极解决方案

由于众所周知的原因,国内更新Android SDK一直是个老大难的事情,一般都要到处找VPN之类的工具来曲线救国.不过其实谷歌已经帮我们想到这点了,我们自身就可以解决问题,步骤如下: 打开SDK Manager,点击Tools->Options,打开设置界面,然后进入http://www.androiddevtools.cn/,找一个顺眼的IP和端口,如 上海GDG镜像服务器地址: http://sdk.gdgshanghai.com 端口:8000 填在上方界面的HTTP Proxy Serv

(通用)Android App代码混淆终极解决方案【转】

App虽然没有那么的高大上,但是代码的混淆是代表了程序员对App的责任心, 也是对App安全的一点点保证.今天我会将自己做Android混淆的过程和体会分享给大家,也避免大家少走弯路,少跳坑. 本篇博客混淆基于Android Studio的IDE开发环境. 其实在android Studio中做混淆,基本就是对Proguard-rules.pro文件的操作.混淆的过程也是有规律可循的.下面我将分几个部分来分别介绍混淆过程. (1)如何开启混淆. (2)混淆的公共部分. (3)需要我们不混淆的代码

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

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

使用Android MediaStore裁剪大图片初次探究

这篇文章相当经典而实用,想当初我做手机拍照截图的时候,大多都是在网上抄来抄去的内容,从来没有人考虑过实际项目中的需求.实际上,拍照传大图片,如果用普通方式会耗用极大的内存,Android一个App原则上的16M内存限制可以一下子被耗光.Android在拍照上有一个隐藏的设计,如果拍照图片过大,只返回一张缩略图.具体到不同手机,都是不一样的. 首先,让我们探讨下Intent以及它的特点.在看了一些代码示例以后,我发现我可以很轻松的使用如下的Intent调用裁剪功能: Intent intent =