android打开相册选取图片或打开相机拍照并进行裁剪

首先是打开本地相册选取图片:

Intent albumIntent = new Intent(Intent.ACTION_PICK);//打开系统的相册
					albumIntent.setType("image/*");
					startActivityForResult(albumIntent, 0x1004);

选取完图片后在onActivityResult编写取数据的操作:

@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (data==null) {
			if (isNull) {

		}else {
      if (requestCode==0x1004) {//从相册选取图片

				getClipPhotoByPickPicture(data.getData(),data.getExtras());
			}
}
}
 获得返回数据对图片进行裁剪:

/**
	 * 取得返回的照片信息
	 * @param uri 传进返回数据的uri
	 * @param bundle 传进返回数据的bundle
	 */
	private void getClipPhotoByPickPicture(Uri uri, Bundle bundle) {

		if (uri == null) {
			/**
			 * 
			 */
		
		} else {
			Intent intent = new Intent("com.android.camera.action.CROP");
			intent.setDataAndType(uri, "image/*");
			intent.putExtra("crop", "true");
			intent.putExtra("aspectX", 1);// aspectX是宽高的比例,这里设置的是正方形(长宽比为1:1)
			intent.putExtra("aspectY", 1);
			intent.putExtra("outputX", 400); // outputX outputY 是裁剪图片宽高
			intent.putExtra("outputY", 400); //不知怎么了,我设置不能设太大,<640
			intent.putExtra("scale", true);
			intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
			intent.putExtra("return-data", true);
			intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());
			intent.putExtra("noFaceDetection", true); 
			startActivityForResult(intent, 0x1006);
		}

	}

调用系统相机拍照并裁剪:

    boolean isNull=false;//判断照相机返回数据是否为空					
       Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");
					File file = new File(Environment.getExternalStorageDirectory()
							+ "/Elephant/accountImg/accountImg.jpg");
					if (file.exists()) {
						file.delete();
					}
					//指定uri存储相片
					getImageByCamera.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(file));
					isNull = true;
					startActivityForResult(getImageByCamera, 0x1005);

同样在onActivityResult中编写接收数据,但此时发现,返回的数据为空,此时得多加一个判断:

if (data==null) {
			if (isNull) {//当返回的data为空,并且isNull为true,说明相机所拍的照片已保存

				File fileImg = new File(Environment.getExternalStorageDirectory()
						+ "/Elephant/accountImg/accountImg.jpg");			
			
				Uri uriFromImg=Uri.fromFile(fileImg);//提取uri

				//裁剪图片
				Intent intent = new Intent("com.android.camera.action.CROP");
				intent.setDataAndType(uriFromImg, "image/*");
				intent.putExtra("crop", "true");
				intent.putExtra("aspectX", 1);// aspectX是宽高的比例,这里设置的是正方形(长宽比为1:1)
				intent.putExtra("aspectY", 1);
				intent.putExtra("outputX", 400); // outputX outputY 是裁剪图片宽高
				intent.putExtra("outputY", 400); //不知怎么了,我设置不能设太大,<640
				intent.putExtra("scale", true);
				intent.putExtra(MediaStore.EXTRA_OUTPUT, uriFromImg);
				intent.putExtra("return-data", true);
				intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());
				intent.putExtra("noFaceDetection", true); // no face detection
				startActivityForResult(intent, 0x1006);
				Log.d("logd", "uri后面");
				isNull=false;
			}
		}else {
//当data!=null
}

同样在onActivityResult中编写,让裁剪后的图片显示在imageView上:

if (requestCode == 0x1006) {

				//接收裁剪好的图片信息并保存到本地文件夹
				Bitmap bmap = data.getParcelableExtra("data");
				iv_show_img.setImageBitmap(bmap);

				// 图像保存到文件中
				FileOutputStream foutput = null;
				try {
					File fileDir = new File(
							Environment.getExternalStorageDirectory()
									+ "/Elephant/accountImg/");
					if (!fileDir.exists()) {
						fileDir.mkdirs();
					}
					File fileImg = new File(fileDir, "accountImg.jpg");
					if (fileImg.exists()) {
						fileImg.delete();
					}

					foutput = new FileOutputStream(fileImg);
					bmap.compress(Bitmap.CompressFormat.JPEG, 50, foutput); // 压缩图片
					
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				} finally {
					if (null != foutput) {
						try {
							foutput.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
				
			

			}


参考:

http://blog.csdn.net/beyond0525/article/details/8939984

http://blog.csdn.net/it_transformers/article/details/42060775#comments






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值