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);
调用相机拍照有两点需要注意,
- 你可以指定拍照所得照片的保存路径,也可以不指定,直接获得照片。二者区别在于后者会使照片失真(照片文件小很多)
- 很多相机拍照之后,照片是旋转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);
以下提供一个完整的例子,源码地址 效果图如下: