andorid下从相册选取/拍照选取一张相片并剪切

在Android编程中,从相册选取或是拍照选取一张照片然后对其进行剪切的需求非常的多

之前的一篇文章只说到如何从相册中获取一张照片,今天就跟大家说说如何将获取到的相片进行剪切

完整源码下载

我们先说一下思路,在android系统中就自带了图片剪切的应用,所以,我们只需要将我们获取到的相片传给图片剪切应用,再将剪切好的相片返回到我们自己的界面显示就ok了

第一步,我们可以先激活系统图片或是相机来获取相片,看代码

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 
  2.      * 从相册获取 
  3.      */  
  4.     public void gallery(View view) {  
  5.         // 激活系统图库,选择一张图片  
  6.         Intent intent = new Intent(Intent.ACTION_PICK);  
  7.         intent.setType("image/*");  
  8.         // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_GALLERY  
  9.         startActivityForResult(intent, PHOTO_REQUEST_GALLERY);  
  10.     }  
  11.   
  12.     /*  
  13.      * 从相机获取  
  14.      */  
  15.     public void camera(View view) {  
  16.         // 激活相机  
  17.         Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");  
  18.         // 判断存储卡是否可以用,可用进行存储  
  19.         if (hasSdcard()) {  
  20.             tempFile = new File(Environment.getExternalStorageDirectory(),  
  21.                     PHOTO_FILE_NAME);  
  22.             // 从文件中创建uri  
  23.             Uri uri = Uri.fromFile(tempFile);  
  24.             intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);  
  25.         }  
  26.         // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CAREMA  
  27.         startActivityForResult(intent, PHOTO_REQUEST_CAREMA);  
  28.     }  

第二步,通过startActivityForResult()方法我们可以在onActivityResult()中来获取到相应的返回值

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.         if (requestCode == PHOTO_REQUEST_GALLERY) {  
  4.             // 从相册返回的数据  
  5.             if (data != null) {  
  6.                 // 得到图片的全路径  
  7.                 Uri uri = data.getData();  
  8.                 crop(uri);  
  9.             }  
  10.   
  11.         } else if (requestCode == PHOTO_REQUEST_CAREMA) {  
  12.             // 从相机返回的数据  
  13.             if (hasSdcard()) {  
  14.                 crop(Uri.fromFile(tempFile));  
  15.             } else {  
  16.                 Toast.makeText(MainActivity.this"未找到存储卡,无法存储照片!"0).show();  
  17.             }  
  18.   
  19.         } else if (requestCode == PHOTO_REQUEST_CUT) {  
  20.             // 从剪切图片返回的数据  
  21.             if (data != null) {  
  22.                 Bitmap bitmap = data.getParcelableExtra("data");  
  23.                 this.iv_image.setImageBitmap(bitmap);  
  24.             }  
  25.             try {  
  26.                 // 将临时文件删除  
  27.                 tempFile.delete();  
  28.             } catch (Exception e) {  
  29.                 e.printStackTrace();  
  30.             }  
  31.   
  32.         }  
  33.   
  34.         super.onActivityResult(requestCode, resultCode, data);  
  35.     }  

第三步,注意到里边有一个crop()方法,顾名思义,就是用于剪切图片的


/*
	 * 剪切图片
	 */
	private void crop(Uri uri) {
		// 裁剪图片意图
		Intent intent = new Intent("com.android.camera.action.CROP");
		intent.setDataAndType(uri, "image/*");
		intent.putExtra("crop", "true");// 发送裁剪信号
		// 裁剪框的比例,1:1
		intent.putExtra("aspectX", 1);
		intent.putExtra("aspectY", 1);
		// 裁剪后输出图片的尺寸大小,剪裁的图片是50dp*50dp
		intent.putExtra("outputX", dip2px(MainActivity.this, 50));
		intent.putExtra("outputY", dip2px(MainActivity.this, 50));

		intent.putExtra("outputFormat", "JPEG");// 图片格式
		intent.putExtra("noFaceDetection", true);// 取消人脸识别
		intent.putExtra("return-data", true);// 是否将数据保留在Bitmap中返回,
		// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUT
		startActivityForResult(intent, PHOTO_REQUEST_CUT);
	}



	// 将dip转化为pixel
	public int dip2px(Context context, float dipValue) {
		float m = context.getResources().getDisplayMetrics().density;
		return (int) (dipValue * m + 0.5f);
	}


第四步,在剪切完成图片后,切图应用就会将图片通过onActivityResult()返回给我们

通过Bitmap bitmap = data.getParcelableExtra("data");我们就拿到了我们想要的bitmap

接下来拿着这个bitmap你想干嘛就干嘛吧大笑


由于上边的代码涉及到读写sdcard,所以要记得在清单文件中授权

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  


附上几张效果图






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值