前言——项目中须要用到对用户头像的裁剪和上传功能。关于裁剪。一開始是想自己来做,可是认为这个东西应该谷歌有开发吧,于是一搜索官方文档。果然有。于是。就果断无耻地用了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样例下载

最新文章

  1. SSRS1:配置SMTP Server发送mail
  2. Java多线程系列--“JUC线程池”04之 线程池原理(三)
  3. debian8 配置使用 nfs
  4. SCC(强连通分量)
  5. iOS 删除NSString中特定字符
  6. Tarjan算法求有向图的强连通分量
  7. 自动抓取java堆栈
  8. discuz X2.5自己写代码,获取当前登录的用户信息
  9. having——至少被订购过两回的订单
  10. MVC MVC 路由详解
  11. Web应用架构的新趋势
  12. fork() &amp;&amp; fork() || fork()
  13. JavaBean规范
  14. 【Bootstrap】优秀小插件收集
  15. Hadoop 数据排序(一)
  16. SPOJ705-New Distinct Substrings-后缀数组
  17. 前端面试(二):N轮面试
  18. HDU3613 Manacher//EXKMP//KMP
  19. MySQL中format()函数
  20. 前端解读控制反转(IOC)

热门文章

  1. PIE SDK栅格拉伸控制
  2. Spark遇到的报错和坑
  3. 2019.03.27 读书笔记 关于GC垃圾回收
  4. oracle 笔记---(六)__表空间
  5. linux 运维基础之 禁止 ping
  6. Beam概念学习系列之PTransform数据处理
  7. Rabbitmq~对Vhost的配置
  8. mongodb随机查询一条记录的正确方法!
  9. 【Linux】修改ubuntu默认字符集
  10. Windows x64位通过PEB获得Kernel32基地址