Android图片系列(1)-------调用系统相册与相机获取图片

Android开发过程中,我们经常需要获取图片,你可以通过获取手机相册的图片,也可以调用相机拍照获取图片。这里主要讲这两个获取图片的方式,并记录其中遇到的小问题。

调用相册获取图片

这个功能非常简单,这里不多说了,这里贴出关键代码

Intent openAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT);
openAlbumIntent.setType("image/*");
startActivityForResult(openAlbumIntent, CHOOSE_PICTURE);

其中CHOOSE_PICTURE是requestCode。执行上述代码,然后在onActivityResult方法中接收返回数据

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		if (resultCode != RESULT_OK)
			return;
		switch (requestCode) {
		case CHOOSE_PICTURE:
			Uri uri = data.getData();
			try {
				if (photo != null)
					photo.recycle();
				photo = MediaStore.Images.Media.getBitmap(getContentResolver(),
						uri);
				System.out.println("bitmap size frome gallery = "
						+ Utils.getBitmapSize(photo));
				image.setImageBitmap(photo);
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}

			break;
		default:
			break;
		}

	}


调用相机拍照获取图片


调用系统相机可以用以下两种方式:

			//指定拍照照片保存路径
			Intent cameraintent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
			cameraFile = DiskUtils.generatePhotoFile(this);
			cameraintent.putExtra(MediaStore.EXTRA_OUTPUT,
					Uri.fromFile(cameraFile));
			this.startActivityForResult(cameraintent, CAMERA_REQUEST);
			
			////,,,,,
			//不指定图片保存路径
			Intent cameraIntent = new Intent(
					android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
			startActivityForResult(cameraIntent, CAMERANF_REQUEST);


调用相机拍照有两点需要注意,

  1. 你可以指定拍照所得照片的保存路径,也可以不指定,直接获得照片。二者区别在于后者会使照片失真(照片文件小很多)
  2. 很多相机拍照之后,照片是旋转90度的,所以需要处理照片角度
第二个问题可以这样轻松解决

	public static int readPictureDegree(String path) {
		int degree = 0;
		try {
			ExifInterface exifInterface = new ExifInterface(path);
			int orientation = exifInterface.getAttributeInt(
					ExifInterface.TAG_ORIENTATION,
					ExifInterface.ORIENTATION_NORMAL);
			switch (orientation) {
			case ExifInterface.ORIENTATION_ROTATE_90:
				degree = 90;
				break;
			case ExifInterface.ORIENTATION_ROTATE_180:
				degree = 180;
				break;
			case ExifInterface.ORIENTATION_ROTATE_270:
				degree = 270;
				break;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return degree;
	}
	
	public static Bitmap rotateBitmap(Bitmap bitmap, float rotateDegree){
		Matrix matrix = new Matrix();
		matrix.postRotate((float)rotateDegree);
		bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);
		return bitmap;
	}

上面两个方法分别是旋转图片,和计算图片的角度,先调用第二个方法获取图片的角度,然后调用第第一个方法将图片旋转。

调用系统剪切图片功能

有时你想要对图片进行剪切,实现也很简单,如下

首先执行以下代码

	// 图片剪切
	private void startPhotoZoom(Uri uri) {

		Intent intent = new Intent("com.android.camera.action.CROP");
		intent.setDataAndType(uri, "image/*");
		// crop为true是设置在开启的intent中设置显示的view可以剪裁
		intent.putExtra("crop", "true");

		// aspectX aspectY 是宽高的比例
		intent.putExtra("aspectX", 0);
		intent.putExtra("aspectY", 0);

		// outputX,outputY 是剪裁图片的宽高
//		intent.putExtra("outputX", 2000);
//		intent.putExtra("outputY", 2000);
		intent.putExtra("return-data", true);
		intent.putExtra("noFaceDetection", true);

		this.startActivityForResult(intent, CROP_2_REQUEST);
	}

然后再onActivityResult中接收数据

photo = data.getExtras().getParcelable("data");
image.setImageBitmap(photo);

以下提供一个完整的例子,源码地址    效果图如下:   

  技术分享          技术分享    技术分享




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。