从android中的库中选择时裁剪图像

我想从画廊中选择一个图像在我的应用程序中。 也就是说,如果我启animation廊并选择一个图像,裁剪窗口应该像我们从iPhone中选择图像时那样。 在Android中是否可行。

我find了一个在android中裁剪图像的教程,但似乎不是我想要的方式。

Crop an Image in ANDROID.

是的,可以使用com.android.camera.action.CROP在android中裁剪图像。 从gallery.you中选择图像url后,您将启动裁剪编辑器:

 Intent intent = new Intent("com.android.camera.action.CROP"); intent.setClassName("com.android.camera", "com.android.camera.CropImage"); File file = new File(filePath); Uri uri = Uri.fromFile(file); intent.setData(uri); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", 96); intent.putExtra("outputY", 96); intent.putExtra("noFaceDetection", true); intent.putExtra("return-data", true); startActivityForResult(intent, REQUEST_CROP_ICON); 

当图片选择Activity return将被选中以保存contents.in onActivityResult

 Bundle extras = data.getExtras(); if(extras != null ) { Bitmap photo = extras.getParcelable("data"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); photo.compress(Bitmap.CompressFormat.JPEG, 75, stream); // The stream to write to a file or directly using the photo } 

并看到这篇文章 ,这也有助于你在android中裁剪图像

本教程正是您需要的:

从图库中挑选图片:

在此处输入图像描述

意图选择动作后裁剪图像

在此处输入图像描述

干杯

虽然是内部API的一部分,但com.android.camera.action.CROP似乎在大多数Android设备上都得到了很好的支持。 这可能会让你开始:

 final Intent intent = new Intent("com.android.camera.action.CROP"); intent.setData(uriOfImageToCrop); intent.putExtra("outputX", 400); intent.putExtra("outputY", 400); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("scale", true); intent.putExtra("noFaceDetection", true); intent.putExtra("output", Uri.fromFile(someOutputFile)); startActivityForResult(intent, SOME_RANDOM_REQUEST_CODE); 

然后在ActivityonActivityResult()方法中处理您需要执行的操作。 您的输出文件应该是裁剪后的图像。

但是,由于此Intent操作是内部API的一部分,因此,如果某些设备不支持Intent ,我强烈建议您使用某种回退行为。 一些制造商提供他们自己的Gallery应用程序,因此无法知道用户的设备是否会识别Intent请不要忘记这个!! 🙂

您可以在选择/拍摄图像后告诉Camera / Gallery-Intent启动裁剪编辑器:

从图库中选择图片:

 Intent pickImageIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); pickImageIntent.setType("image/*"); pickImageIntent.putExtra("crop", "true"); pickImageIntent.putExtra("outputX", 200); pickImageIntent.putExtra("outputY", 200); pickImageIntent.putExtra("aspectX", 1); pickImageIntent.putExtra("aspectY", 1); pickImageIntent.putExtra("scale", true); pickImageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriWhereToStore); pickImageIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); startActivityForResult(pickImageIntent, RESULT_LOAD_IMAGE); 

拍照:

 Intent takePicIntent = new Intent("android.media.action.IMAGE_CAPTURE"); takePicIntent .putExtra("crop", "true"); takePicIntent .putExtra("outputX", 200); takePicIntent .putExtra("outputY", 200); takePicIntent .putExtra("aspectX", 1); takePicIntent .putExtra("aspectY", 1); takePicIntent .putExtra("scale", true); takePicIntent .putExtra(MediaStore.EXTRA_OUTPUT, uriWhereToStore); takePicIntent .putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); startActivityForResult(takePicIntent , RESULT_LOAD_IMAGE); 

我这样解决了这个问题

 private void pickUserImage() { if (doHavePermission()) { Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); photoPickerIntent.setType("image/*"); photoPickerIntent.putExtra("crop", "true"); photoPickerIntent.putExtra("scale", true); photoPickerIntent.putExtra("outputX", 256); photoPickerIntent.putExtra("outputY", 256); photoPickerIntent.putExtra("aspectX", 1); photoPickerIntent.putExtra("aspectY", 1); photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri()); startActivityForResult(photoPickerIntent, PICK_FROM_GALLERY); } } 

在stackoverflowpost中find我的完整解决方案