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 ...
随机推荐
- 超级详细全截图化VMware 安装ubantu
一,下载镜像 由于ubantu时国外源所以下载十分的缓慢 这里我用清华源下载:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/18.10/ub ...
- express遇到的问题
1. 如何引入express? cnpm install express --save 其中--save可以保存到依赖项中. 接着 var express = require("expres ...
- 案例40-层与层之间的解耦(面向接口编程)BeanFactory
1 bean.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans> <!- ...
- php 中全局变量global 的使用
简介 即使开发一个新的大型PHP程序,你也不可避免的要使用到全局数据,因为有些数据是需要用到你的代码的不同部分的.一些常见的全局数据有:程序设定类.数 据库连接类.用户资料等等.有很多方法能够使这些数 ...
- pat00-自测2. 素数对猜想 (20)
00-自测2. 素数对猜想 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们定义 dn 为:dn ...
- 百度地图api-动态添加覆盖物
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- BNU29064——硬币水题II——————【事件概率】
硬币水题II Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class name: ...
- Video标签事件与属性
事件与属性 属性 描述 audioTracks 返回可用的音轨列表(MultipleTrackList对象) autoplay 媒体加载后自动播放 buffered 返回缓冲部件的时间范围(TimeR ...
- solidity合约面向对象
1. 属性[状态变量]的访问权限 public internal[合约属性默认的权限] private 说明:属性默认访问全向为internal,internal和private类型的属性,外部是 ...
- 【U1结业机试题】新闻内容管理系统:解析XML文件读取Html模版生成网页文件
一.作业要求: 1.在xml文件中创建新闻节点news,包含标题.作者.日期.正文等信息 2.创建HTML模板文件 3.读取xml中所有新闻信息,并使用新闻信息替换模板文件中占位符,从而为每一条新闻生 ...