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的问题,问题是,在调用自带的裁剪功能的时候,由于没看源码,所以不知道在调整裁剪框的时候,显示的那副图片有没有进行压缩,如果没有进行压缩,那么当图片很大的时候,加载起来就很容易出现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;
	}

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

下面是一个关于本主题的DEMO。有需要的童鞋可以去看看。

DEMO例子下载

Android笔记之 图片自由裁剪

时间: 2024-12-11 00:50:55

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

在Android中实现图片的裁剪

    本实例的功能室将用户选择的图片裁剪后放入ImagView,布局文件是个Button和ImageView.为了图片的正常显示,我们在裁剪后先将裁剪好的图片先存放到SD卡中,这样就能在以后开启应用的时候直接调用了. main_activity.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.androi

android选择本地图片并裁剪

本文使用Android原生的选择和裁剪功能.下面是代码: public class PickAndCropActivity extends AppCompatActivity implements View.OnClickListener { public static final int REQUEST_CODE_PICK_IMG = 1; public static final int REQUEST_CODE_CROP_IMG = 2; /** * ImageView展示选择的图片和裁剪得

Android选取相册图片并裁剪

前言 Android应用中经常会遇到上传相册图片的需求,这里记录一下如何进行相册图片的选取和裁剪. 相册选取图片 1. 激活相册或是文件管理器,来获取相片,代码如下: private static final int TAKE_PICTURE_FROM_ALBUM = 1; private void takePictureFromAlbum() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("ima

Android图片裁剪之自由裁剪

我的博客http://blog.csdn.net/dawn_moon 客户的需求都是非常怪的.我有时候在给客户做项目的时候就想骂客户是sb.可是请你相信我,等你有需求,自己变成客户的时候,给你做项目的哥哥肯定也会骂你是sb. 是这种,客户须要做一个图片上传的功能,这个图片须要裁剪.一般而言,这东西用系统自带的裁剪就搞定了.但是客户不,他要能够自由裁剪,就是长宽比不固定,想裁成什么比例就裁成什么比例,我一听,蛋都碎了. 没有办法,客户sb归sb,需求还是得照做,不然不给钱要喝西北风了. 图片裁剪的

Android 拍照、选择图片并裁剪

转载请标明出处: http://blog.csdn.net/xuehuayous/article/details/51324656; 本文出自:[Kevin.zhou的博客] 前言:前段时间做项目用到了图片裁剪,调用系统裁剪图片,结果在我的小米3上一直有问题,裁剪界面打不开,在其他设备上没问题,于是研究其他软件是怎么做的,淘宝的裁剪图片是自己做的,当然没问题,京东的是调用的系统的也是打不开裁剪界面.但是不知道为什么会出现这个问题,在其他小米设备上貌似没有问题.看来调用系统的裁剪图片还是不靠谱的.

Android中简单实现选择图片并裁剪

在android中选择图片是一个很常见的功能,图片的来源通常情况下是从相机获取和从相册获取两种. 先来写一个简单的选择按钮和一个能显示图片的ImageView <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent&qu

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

转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46864777 问题: 在郭神的第一行代码中,第8章的从相冊中选择图片这块,从相冊选一张裁剪后显示到屏幕.可是执行后会发现从相冊选了图片后.没有弹出裁剪的界面,直接返回. 方案: 查找原因时,发现SD卡路径下的output_image.jpg是一个0字节文件.所以 这张图片没有生成.然后我认为是向系统发送选择照片的意图出了问题.我好奇的查看了下系统的图库应用(gallery)源代码

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

在 Android应用中,非常多时候我们须要实现上传图片,或者直接调用手机上的拍照功能拍照处理然后直接显示并上传功能,以下将讲述调用相机拍照处理图片然后显示和调用手机相冊中的图片处理然后显示的功能,要想实现上传功能.一般都是上传到数据库中,将imageView中的图片取出来然后存到数据库中就可以. 以下讲述实现的步骤: 1. 调用相冊中的图片裁剪然后显示. 1.1 使用Intent获取从相冊中选择的照片. 1.2 对获取的图片进行裁剪处理.裁剪处理也是使用Intent调用的Android自带的裁

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

我们很多时候需要进行图片的裁剪,其实这个功能在android系统中已经有一套解决方案了,虽然界面和效果并不是很优秀但功能毫无疑问是完美实现了.至于,不用自带的方案怎么做自定义,这个就是后话了.本篇主要讲解的是裁剪的原理和流程,外带分析了大图裁剪和小图裁剪的不同之处,同时给出具体的实现方案. 一.原理+流程 andorid提供了一个action,com.android.camera.action.CROP, 是Intent intent = new Intent("com.android.came