在Android中从图库中select图像时裁剪图像

我想在我的应用程序中从图库中select一个图像。 即如果我启animation廊,并select一个图像的裁剪窗口应该来,当我们从iPhone中select一个图像。 在Android中可能吗?

我发现一个教程在Android中裁剪图像,但似乎不是我想要的方式。

Crop an Image in ANDROID.

Solutions Collecting From Web of "在Android中从图库中select图像时裁剪图像"

是的,可以通过使用com.android.camera.action.CROP在android中裁剪图像。 从图库中select图像的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); 

当图片selectActivity返回时将被选中以保存内容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 } 

并看到这个post ,这也是帮助你在android中裁剪图像

本教程正是您所需要的:

从图库中挑选图像:

在这里输入图像说明

在意图select操作后裁剪图像

在这里输入图像说明

干杯

虽然是内部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的一部分,所以我强烈build议 ,如果某个设备不支持Intent ,那么你有某种后备行为。 一些制造商提供自己的图库应用程序,因此无法知道用户的设备是否会识别该Intent请不要忘记这个! 🙂

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

从图库中select图片:

 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); } } 

在这里find我的完整解决scheme在stackoverflow后