Android笔记之 图片自由裁剪
前言——项目中须要用到对用户头像的裁剪和上传功能。关于裁剪。一開始是想自己来做,可是认为这个东西应该谷歌有开发吧,于是一搜索官方文档。果然有。于是。就果断无耻地用了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。有须要的童鞋能够去看看。
Android笔记之 图片自由裁剪的更多相关文章
- 在Android中实现图片的裁剪
本实例的功能是将用户选择的图片裁剪后放入ImagView,布局文件是个Button和ImageView.为了图片的正常显示,我们在裁剪后先将裁剪好的图片先存放到SD卡中,这样就能在以后开启应用 ...
- Xamarin开发Android笔记:图片切换ImageSwitcher
在移动应用开发过程中经常会使用到图片展示场景,例如利用多张图片说明一个产品的特点,此处就会使用到ImageSwithcher,当然也可以使用ViewFliper来实现,但使用ViewFliper的时候 ...
- Android笔记-获取图片
1. 图片放在sdcard中,根据路径获得: Bitmap imageBitmap = BitmapFactory.decodeFile(path) (path 是图片的路径,跟目录是/sdcard ...
- Android图片裁剪之自由裁剪
我的博客http://blog.csdn.net/dawn_moon 客户的需求都是非常怪的.我有时候在给客户做项目的时候就想骂客户是sb.可是请你相信我,等你有需求,自己变成客户的时候,给你做项目的 ...
- android 照相或从相册获取图片并裁剪
照相或从相册获取图片并裁剪 在android应用中很多时候都要获取图片(例如获取用户的头像)就需要从用户手机上获取图片.可以直接照,也可以从用户SD卡上获取图片,但获取到的图片未必能达到要求.所以要对 ...
- 详细解释如何通过Android自带的方式来实现图片的裁剪——原理分析+解决方案
我们很多时候需要进行图片的裁剪,其实这个功能在android系统中已经有一套解决方案了,虽然界面和效果并不是很优秀但功能毫无疑问是完美实现了.至于,不用自带的方案怎么做自定义,这个就是后话了.本篇主要 ...
- android开发——从相冊中选择图片不裁剪
转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46864777 问题: 在郭神的第一行代码中,第8章的从相冊中选择图片这块,从相冊选 ...
- Android调用相机实现拍照并裁剪图片,调用手机中的相冊图片并裁剪图片
在 Android应用中,非常多时候我们须要实现上传图片,或者直接调用手机上的拍照功能拍照处理然后直接显示并上传功能,以下将讲述调用相机拍照处理图片然后显示和调用手机相冊中的图片处理然后显示的功能,要 ...
- Android笔记之使用Glide加载网络图片、下载图片
Glide简介 不想说太多,真的很方便:P)可以节省我不少时间 GitHub地址:https://github.com/bumptech/glide 加载网络图片到ImageView Glide.wi ...
随机推荐
- 2.3 if switch for等流程控制
if条件中可以写多个语句,语句的作用域仅限于if,不可在if之外的地方使用 package main import ( "fmt" "io/ioutil" ) ...
- vue项目echarts画布删除历史数据重新渲染数据
vue用到echarts时,根据select多选下拉框进行echarts折线图渲染.发现折现只能增加不能减少,后来根据echarts API文档发现 调用方式: chart.setOption(opt ...
- (Frontend Newbie)JavaScript基础之常见数据类型
JavaScript中的数据类型分为两种,一种是简单数据类型,包括Undefined.Null.Boolean.Number和String,另一种是复杂数据类型,即Object,也可称作为引用类型. ...
- 新手 php连接数据库大概。简单过程浅析以及遇到的问题分析
原文作者:aircraft 原文地址: https://www.cnblogs.com/DOMLX/p/8116845.html 重点:PHP运行在服务器上的请记住!!! 1.在连接数据库与PHP之前 ...
- Unity中Shader和AssetBundle结合使用的注意事项
之前遇到了一件事情就是打包安卓的ab后,unity在editor启动下,加载出来的abshader丢失,其实发布安卓后运行是正常的,当时还纠结了半天,还写了个重新赋值的脚本 下面是unity开发的一些 ...
- 深入理解Javascript封装DOMContentLoaded事件
最近在写一个Javascript的框架,刚把DOMContentLoaded事件封装好,略带小兴奋,把开发过程中遇到的原理和兼容性问题做篇笔记,省的忘记到处找. 我们在写js代码的时候,一般都会添加w ...
- 用DebuggerDisplay在Visual Studio的调试器中定制类的显示方式
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用DebuggerDisplay在Visual Studio的调试器中定制类的显示方式.
- Java循环结构之while和do-while循环
循环结构知识点 本章技能目标 1理解循环的含义 2会使用while循环 3会使用do-while循环 4会使用调试解决简单的程序错误 一. 循环的含义 循环就是重复的做……(Java程序中的循环结 ...
- Java笔记之Scanner先读取一个数字,在读取一行字符串方法分析
问题:大家在学习Java读取数据的时候一般都是使用Scanner方法读取数据,但是其中有一个小问题大家可能不知道, 就是我们在使用scanner的时候如果你先读取一个数字,在读取一行带有空格的字符串, ...
- python之迭代器
原文 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的gen ...