Android大图片裁剪解决方案

来源:互联网 发布:网络运营者应当为 编辑:程序博客网 时间:2024/05/11 22:04

http://blog.csdn.net/floodingfire/article/details/8144617

 

    上一篇博客中,我们学习到了如何使用Android相册截图。在这篇博客中,我将向大家展示如何拍照截图。

    拍照截图有点儿特殊,要知道,现在的Android智能手机的摄像头都是几百万的像素,拍出来的图片都是非常大的。因此,我们不能像对待相册截图一样使用Bitmap小图,无论大图小图都统一使用Uri进行操作。

    一、首先准备好需要使用到的Uri:

1private static final String IMAGE_FILE_LOCATION = "file:///sdcard/temp.jpg";//temp file
2Uri imageUri = Uri.parse(IMAGE_FILE_LOCATION);//The Uri to store the big bitmap

    二、使用MediaStore.ACTION_IMAGE_CAPTURE可以轻松调用Camera程序进行拍照:

1Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//action is capture
2intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
3startActivityForResult(intent, TAKE_BIG_PICTURE);//or TAKE_SMALL_PICTURE
    三、接下来就可以在 onActivityResult中拿到返回的数据(Uri),并将Uri传递给截图的程序。
01switch (requestCode) {
02case TAKE_BIG_PICTURE:
03    Log.d(TAG, "TAKE_BIG_PICTURE: data = " + data);//it seems to be null
04    //TODO sent to crop
05    cropImageUri(imageUri, 800400, CROP_BIG_PICTURE);
06     
07    break;
08case TAKE_SMALL_PICTURE:
09    Log.i(TAG, "TAKE_SMALL_PICTURE: data = " + data);
10    //TODO sent to crop
11    cropImageUri(imageUri, 300150, CROP_SMALL_PICTURE);
12     
13    break;
14default:
15    break;
16}
    可以看到,无论是拍大图片还是小图片,都是使用的Uri,只是尺寸不同而已。我们将这个操作封装在一个方法里面。
01private void cropImageUri(Uri uri, int outputX, int outputY, int requestCode){
02    Intent intent = new Intent("com.android.camera.action.CROP");
03    intent.setDataAndType(uri, "image/*");
04    intent.putExtra("crop""true");
05    intent.putExtra("aspectX"2);
06    intent.putExtra("aspectY"1);
07    intent.putExtra("outputX", outputX);
08    intent.putExtra("outputY", outputY);
09    intent.putExtra("scale"true);
10    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
11    intent.putExtra("return-data"false);
12    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
13    intent.putExtra("noFaceDetection"true); // no face detection
14    startActivityForResult(intent, requestCode);
15}
    四、最后一步,我们已经将数据传入裁剪图片程序,接下来要做的就是处理返回的数据了:
01switch (requestCode) {
02case CROP_BIG_PICTURE://from crop_big_picture
03    Log.d(TAG, "CROP_BIG_PICTURE: data = " + data);//it seems to be null
04    if(imageUri != null){
05        Bitmap bitmap = decodeUriAsBitmap(imageUri);
06        imageView.setImageBitmap(bitmap);
07    }
08    break;
09case CROP_SMALL_PICTURE:
10    if(imageUri != null){
11        Bitmap bitmap = decodeUriAsBitmap(imageUri);
12        imageView.setImageBitmap(bitmap);
13    }else{
14        Log.e(TAG, "CROP_SMALL_PICTURE: data = " + data);
15    }
16    break;
17default:
18    break;
19}

效果图:

代码托管于GitHub,会不定期更新:https://github.com/ryanhoo/PhotoCropper​

0 0