前言——项目中须要用到对用户头像的裁剪和上传功能。关于裁剪。一開始是想自己来做,可是认为这个东西应该谷歌有开发吧,于是一搜索官方文档。果然有。于是。就果断无耻地用了Android自带有关于照片的自由裁剪。

因为时间太紧,尽管不太华丽,可是胜在能用,节省时间嘛。

详细是通过 Intent的action来实现的。

 

关键代码例如以下:

public void imageCut(Uri uri) {

	Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
//开启裁剪功能
intent.putExtra("crop", "true");
//设定宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//设定裁剪图片宽高
intent.putExtra("outputX", 100);
intent.putExtra("outputY", 100);
//要求返回数据
intent.putExtra("return-data", true);
startActivityForResult(intent, 100);
}

返回数据后直接在onActivityResult里对返回的图片数据进行显示即可了,这里因为剪切后的图片较小,个人认为应该不用考虑OOM的问题,问题是,在调用自带的裁剪功能的时候,因为没看源代码,所以不知道在调整裁剪框的时候,显示的那副图片有没有进行压缩。假设没有进行压缩。那么当图片非常大的时候,载入起来就非常easy出现OOM了。明显对此因为是调用官方的API,我没有方法去解决它。

唯一的办法就是不用它。而是自己去写一个,就能够避免这个问题。

利用例如以下的代码进行压缩,非常好地避免OOM问题。

/*
* 压缩图片,返回的是压缩后的照片
*/
public static Bitmap revitionImage(String path,int size){
Bitmap bitmap = null;
try {
//先用图片路径打开图片文件,缓冲到一个缓存输入流中
BufferedInputStream in = new BufferedInputStream(new FileInputStream(
new File(path)));
//用參数代表变量来记录当前照片的信息,比方图片大小
BitmapFactory.Options options = new BitmapFactory.Options();
//把inJustDecodeBounds设置为true,则全然不用分配内存就能够得到给位图文件bitmap的信息,
//如此得到大小后。就能够对其进行7压缩,然后在内存中生成一个更小的bitmap,节省了内存
options.inJustDecodeBounds = true;
//译码位图文件。仅仅为了得到原图的信息
BitmapFactory.decodeStream(in
,null,options);
//记得关闭流
in.close();
int i = 0; while(true){
//右移i位是因为以下的pow取一半了,新生成的图片是原来的二分之中的一个
if (((options.outWidth >> i)<=size) && ((options.outHeight >> i) <=size)) {
//这时候应取得照片了
in = new BufferedInputStream(new FileInputStream(new File(path)));
//pow是次方方法。2的i次方。inSampleSize图片均分取样值。比如
//inSampleSize == 4 returns an image that is 1/4 the width/height of the original, and 1/16 the number of pixels.
options.inSampleSize = (int)Math.pow(2.0, i);
//这时候的图片已经符合我们设定的256大小了,所以要在设置false,同意输出,创建图片
//真正地生成一个有像素的,经过缩放的bitmap
options.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeStream(in,null,options);//获得n分之中的一个原图,小于256*256
break;
}else {
i++;
}
} } catch (IOException e) {
Log.i(TAG, "压缩图片出错"+e.toString());
}
return bitmap;
}

最后仅仅能先用着了。有时间再深究或者自己折腾一个。以下是效果图,看着还行。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGluZmVuZzI0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

以下是一个关于本主题的DEMO。有须要的童鞋能够去看看。

DEMO样例下载

Android笔记之 图片自由裁剪的更多相关文章

  1. 在Android中实现图片的裁剪

        本实例的功能是将用户选择的图片裁剪后放入ImagView,布局文件是个Button和ImageView.为了图片的正常显示,我们在裁剪后先将裁剪好的图片先存放到SD卡中,这样就能在以后开启应用 ...

  2. Xamarin开发Android笔记:图片切换ImageSwitcher

    在移动应用开发过程中经常会使用到图片展示场景,例如利用多张图片说明一个产品的特点,此处就会使用到ImageSwithcher,当然也可以使用ViewFliper来实现,但使用ViewFliper的时候 ...

  3. Android笔记-获取图片

     1. 图片放在sdcard中,根据路径获得: Bitmap imageBitmap = BitmapFactory.decodeFile(path) (path 是图片的路径,跟目录是/sdcard ...

  4. Android图片裁剪之自由裁剪

    我的博客http://blog.csdn.net/dawn_moon 客户的需求都是非常怪的.我有时候在给客户做项目的时候就想骂客户是sb.可是请你相信我,等你有需求,自己变成客户的时候,给你做项目的 ...

  5. android 照相或从相册获取图片并裁剪

    照相或从相册获取图片并裁剪 在android应用中很多时候都要获取图片(例如获取用户的头像)就需要从用户手机上获取图片.可以直接照,也可以从用户SD卡上获取图片,但获取到的图片未必能达到要求.所以要对 ...

  6. 详细解释如何通过Android自带的方式来实现图片的裁剪——原理分析+解决方案

    我们很多时候需要进行图片的裁剪,其实这个功能在android系统中已经有一套解决方案了,虽然界面和效果并不是很优秀但功能毫无疑问是完美实现了.至于,不用自带的方案怎么做自定义,这个就是后话了.本篇主要 ...

  7. android开发——从相冊中选择图片不裁剪

    转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46864777 问题: 在郭神的第一行代码中,第8章的从相冊中选择图片这块,从相冊选 ...

  8. Android调用相机实现拍照并裁剪图片,调用手机中的相冊图片并裁剪图片

    在 Android应用中,非常多时候我们须要实现上传图片,或者直接调用手机上的拍照功能拍照处理然后直接显示并上传功能,以下将讲述调用相机拍照处理图片然后显示和调用手机相冊中的图片处理然后显示的功能,要 ...

  9. Android笔记之使用Glide加载网络图片、下载图片

    Glide简介 不想说太多,真的很方便:P)可以节省我不少时间 GitHub地址:https://github.com/bumptech/glide 加载网络图片到ImageView Glide.wi ...

随机推荐

  1. 《UML和模式应用(原书第3版)》目录

    学习 <UML和模式应用(原书第3版)>目标: 理解OOA/D思想 如何使用UML建模 如何使用设计模式 如何设计分层架构 目录: 第1部分 绪论 第1章 面向对象分析和设计 第2章 迭代 ...

  2. python 爬虫系列03--职位爬虫

    职位爬虫 import requests from lxml import etree cookie = { 'Cookie':'user_trace_token=20181015184304-692 ...

  3. Git学习手记

    直接使用github的客户端即可 1.简介 集中化的版本控制系统( Centralized Version Control Systems,简称 CVCS )应运而生.这类系统,诸如 CVS,Subv ...

  4. Ace向你推荐一些实用的干货库~开发安卓的好帮手

    1 毁灭地球的军火库arsenal- 你想要的枪这里都有卖 哈哈哈哈 , http://android-arsenal.com/ 2 黑科技---在线反编译----嘿嘿嘿  在线反编译 方便简单 客官 ...

  5. 让 framset 框架中的页面全屏显示

    <script type="text/javascript"> window.onload=function(){ if(window.parent!=window){ ...

  6. C# 面试题二

    1.        请编程实现一个冒泡排序算法? int [] array = new int [*] ; ; ; i < array.Length - ; i++) { ; j < ar ...

  7. ASP.NET生命周期详解(转)

    看到好文章需要分享. 最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多 ...

  8. python搭建本地服务器

    python搭建本地服务器 python3以上版本 'python3 -m http.server 8000' 默认是8000端口,可以指定端口,打开浏览器输入http://127.0.0.1:800 ...

  9. python的传递实参

    你经常会发现,向函数传递列表很有用,这种列表包含的可能是名字.数字或更复杂的对象(如字典).将列表传递给函数后,函数就能直接访问其内容 1.在函数中修改列表 将列表传递给函数后,函数就可对其进行修改. ...

  10. scss-嵌套属性

    使用scss不但可以实现选择器的嵌套,属性也可以进行嵌套. 首先看一段代码实例: nav { border-style: solid; border-width: 1px; border-color: ...