Android从相册选图或相机拍照后对图片进行裁剪

Android中直接打开相册选图或直接拍照都很简单,通过指定Intent调用对应页面即可

对图片进行裁剪也可以调用系统CROP对应intent完成

但不少手机都在接收数据时或裁剪过程中多少出点问题,比如onActivityResult中接收不到裁剪后的数据,裁剪页面卡住没反应...

在网上搜集资料整理后,搞了个自认为可以通用的demo,记录一下

拍照或裁剪后可以指定图片存储路径Uri,通过Uri可以获取原尺寸图片,尤其在CROP时如果return-data指定为true,则会返回bitmap对象,小图没问题,当图片很大时就会遇到问题了,所以为了通用,这里就统一使用Uri

布局文件就两个按钮一个ImageView,其中一个按钮用来打开相册选图进行缩放,另外一个用来打开相机,ImageView用来显示裁剪后的图片,xml就不贴了

import java.io.File;
import java.io.FileNotFoundException;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import cn.look.R;

/**相机相册选图缩放*/
public class PhotoPickerActivity extends Activity {
		private ImageView mIv;
		public static final int CAMERA = 1;// 拍照
		public static final int ALUM = 2; // 相册
		public static final int CROP = 3;// 裁剪结果
		private Uri mUriSave;//裁剪后图片保存路径
		private Uri mUriCamera;//拍照图片临时存放路径

		@Override
		protected void onCreate(Bundle savedInstanceState) {
			super.onCreate(savedInstanceState);
			setContentView(R.layout.activity_image);
			mIv = (ImageView) findViewById(R.id.iv);
			mUriSave = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"temp.jpg"));
			mUriCamera = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"camera.jpg"));
			log("URI:"+mUriSave);
		}

		public void camera(View v) {
			Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
			intent.putExtra(MediaStore.EXTRA_OUTPUT, mUriCamera);
			startActivityForResult(intent, CAMERA);
		}

		public void alum(View v) {
			Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
			intent.setType("image/*");
			intent.putExtra("crop", "true");
			intent.putExtra("aspectX", 2);
			intent.putExtra("aspectY", 1);
			intent.putExtra("outputX", 600);
			intent.putExtra("outputY", 600);
			intent.putExtra("scale", true);
			intent.putExtra("return-data", false);//截小图这里true,不用设置MediaStore.EXTRA_OUTPUT
			intent.putExtra(MediaStore.EXTRA_OUTPUT, mUriSave);
			intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
			intent.putExtra("noFaceDetection", true);
			startActivityForResult(intent, ALUM);
		}

		@Override
		protected void onActivityResult(int resquestCode, int resultCode, Intent data) {
			log(resquestCode+"[]"+resultCode+"==onActivityResult:"+data);
			if (data == null)
				return;
			switch (resquestCode) {
			case CAMERA:// 拍照
				startPhotoZoom(mUriCamera);
				break;
			case ALUM: // 相册
			case CROP://裁剪  不管怎么选的图裁剪结果都是同一个文件 直接uri读取好了 省事
				log("裁剪结果返回intent.data="+data.getData());
				Bitmap bitmap = null;
				try {
					bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(mUriSave));
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				}
				mIv.setImageBitmap(bitmap);
				break;
			}
			super.onActivityResult(resquestCode, resultCode, data);

		}

		public void startPhotoZoom(Uri uri) {
			log("开始缩放uri:"+uri);
			cropImageUri(uri, 1000, 1000, CROP);
		}
		private void cropImageUri(Uri uri, int outputX, int outputY, int requestCode){
			Intent intent = new Intent("com.android.camera.action.CROP");
			intent.setDataAndType(uri, "image/*");
			intent.putExtra("crop", "true");
			intent.putExtra("aspectX", 2);//缩放比例
			intent.putExtra("aspectY", 1);
			intent.putExtra("outputX", outputX);//输出图片大小
			intent.putExtra("outputY", outputY);
			intent.putExtra("scale", true);//保持比例
			intent.putExtra(MediaStore.EXTRA_OUTPUT, mUriSave);//裁剪结果存放路径
			intent.putExtra("return-data", false);//是否返回bitmap
			intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
			intent.putExtra("noFaceDetection", true); // no face detection
			startActivityForResult(intent, requestCode);
		}

		private void log(String s) {
			Log.e("---look---", s == null ? "NULL" : s);
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值