从图库中拾取图像后裁剪图像 android

Crop image after picking up from gallery android

想要在用户从图库中选择图像后裁剪图像。

所以基本上当用户 select 从图库中获取图像时,他应该能够裁剪它,当他点击确定时,图像应该被发送到服务器。

单击按钮时,我有启动图库的代码。

Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent,RESULT_TRUE);

然后我有这段代码,其中 select 图片来自图库并将其上传到 firebase。

@Override
    public  void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RESULT_TRUE && resultCode == RESULT_OK) {
            dialog.show();
            Uri url = data.getData();
            StorageReference filepath = mstorage.child("photos").child(url.getLastPathSegment());
            filepath.putFile(url).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    Toast.makeText(getContext(), "upload done", Toast.LENGTH_LONG).show();
                    Uri downloadurl = taskSnapshot.getDownloadUrl();
                    String imageUrl = downloadurl.toString();
                    Glide.with(getContext()).load(imageUrl).centerCrop().placeholder(R.drawable.ic_menu_camera).crossFade().into(mImage1);
                    SubscriberService subscriberService = new SubscriberService();
                    subscriberService.addItemChildList(AddImagesFragment.this, mAuth.getCurrentUser().getUid(), "images", imageUrl, place);
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }

有人可以帮我提供裁剪图像的代码吗?

谢谢

您可以使用此方法进行裁剪:-

private void performCrop(String picUri) {
        try {
            //Start Crop Activity

            Intent cropIntent = new Intent("com.android.camera.action.CROP");
            // indicate image type and Uri
            File f = new File(picUri);
            Uri contentUri = Uri.fromFile(f);

            cropIntent.setDataAndType(contentUri, "image/*");
            // set crop properties
            cropIntent.putExtra("crop", "true");
            // indicate aspect of desired crop
            cropIntent.putExtra("aspectX", 1);
            cropIntent.putExtra("aspectY", 1);
            // indicate output X and Y
            cropIntent.putExtra("outputX", 280);
            cropIntent.putExtra("outputY", 280);

            // retrieve data on return
            cropIntent.putExtra("return-data", true);
            // start the activity - we handle returning in onActivityResult
            startActivityForResult(cropIntent, RESULT_CROP);
        }
        // respond to users whose devices do not support the crop action
        catch (ActivityNotFoundException anfe) {
            // display an error message
            String errorMessage = "your device doesn't support the crop action!";
            Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
            toast.show();
        }
    } 

参考链接,android:select image from gallery then crop that and show in an imageview

Crop an image when selected from gallery in android

看看this教程..

看看这个library,也许你会得到一个合适的解决方案。

首先将 uCrop 添加到您的 Gradle,然后 要使用它,请写这个 onActivityResult,

case IMAGE:
    UCrop.of(data.getData(), Uri.fromFile(new File(this.getCacheDir(), "IMG_" + System.currentTimeMillis())))
                    .start(YourActivity.this);
break;

之后将 onActivityResults 中的 uCrop 结果处理为(您可以在那边使用 switch case 来处理多个请求代码):

                 case UCrop.REQUEST_CROP:
                    Uri imgUri = UCrop.getOutput(data);
                    if (imgUri != null) {
                        String selectedImage = imgUri.getPath();

                       // load selectedImage into ImageView
                    } else {
                        Snackbar.make(view, R.string.str_bad_image_file, Snackbar.LENGTH_LONG)
                                .show();
                    }
                    break;
                case UCrop.RESULT_ERROR:
                    Snackbar.make(view, R.string.str_bad_image_file, Snackbar.LENGTH_LONG)
                            .show();
                    break;

看看这个library。它提供基本的裁剪功能并被很多人使用

这是一个经过良好测试的代码,因此它肯定会起作用。尝试使用下面的代码来裁剪图像:
私有 CropImageView img_crop;
私人整数 CROP_RESULT = 3;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_crop_);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    toolbar.setNavigationIcon(R.drawable.back_white);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
    });
    img_crop = (CropImageView) findViewById(R.id.img_crop);
    img_crop.setInitialFrameScale(0.75f);

    img_crop.setAnimationEnabled(true);
    img_crop.setAnimationDuration(300);
    img_crop.setCropMode(CropImageView.CropMode.RATIO_3_4);
    configureDefaultImageLoader(Crop_Activity.this);
    Intent intent = getIntent();
    Bundle b = intent.getExtras();
    String path = " ";
    final String type = b.getString("type");
    path = b.getString("BitmapImage");
    Log.e("Crop_Uri>>", path.toString());
    {
        try {
            InputStream image_stream = null;

            image_stream = getContentResolver().openInputStream(Uri.parse("file://" + path.toString()));
            Bitmap bitmap1 = BitmapFactory.decodeStream(image_stream);
            if (bitmap1 != null) {
                bitmap1.recycle();
                bitmap1 = null;
            }
            ImageLoader.getInstance().displayImage(ImageDownloader.Scheme.FILE.wrap(path.toString()), img_crop);
            //  img_crop.setImageBitmap(bitmap1);
            Log.e("Image//", "//" + "yes");
        } catch (Exception e) {
            //handle exception
            Log.e("ExceptionImage>>", "//" + e);
        }
    }


    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
          /*  Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();*/
            if (img_crop.getImageBitmap() != null) {
                Bitmap crop_bitmap = img_crop.getCroppedBitmap();
                ByteArrayOutputStream stream = new ByteArrayOutputStream();

                File dest = new File(getFilename());
                try {
                    FileOutputStream out = new FileOutputStream(dest);
                    crop_bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
                    out.flush();
                    out.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                byte[] byteArray = stream.toByteArray();

                Intent intent = new Intent();
                intent.putExtra("croped_bitmap_uri", dest.getAbsolutePath());
                intent.setAction("ok");
                setResult(CROP_RESULT, intent);
                deleteFile();
                finish();
            } else {
                Toast.makeText(Crop_Activity.this, "Crop Images Not Processed !", Toast.LENGTH_SHORT).show();
            }

        }
    });
}

public String getFilename() {
    File myDirectory = new File(Environment.getExternalStorageDirectory(), "Konnect_Mom/Konnect_Mom_cropped_img");
    if (!myDirectory.exists()) {
        myDirectory.mkdirs();
    }

    String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(new Date());
    String mImageName = "cropped_img" + ".jpg";
    String uriSting = (myDirectory.getAbsolutePath() + "/" + mImageName);
    return uriSting;

}

public void deleteFile() {
    File file = new File(Environment.getExternalStorageDirectory() + "Konnect_Mom/Konnect_Mom_cropped_img/cropped_img.jpg");
    if (file.exists()) {

        file.delete();
    }

}

public static void configureDefaultImageLoader(Context ctx) {
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(ctx).threadPriority(Thread.NORM_PRIORITY - 2).denyCacheImageMultipleSizesInMemory().diskCacheFileNameGenerator(new Md5FileNameGenerator()).tasksProcessingOrder(QueueProcessingType.FIFO).build();
    ImageLoader.getInstance().init(config);
    DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
            .cacheInMemory(true)
            .cacheOnDisk(true)
            .showImageOnLoading(android.R.drawable.stat_sys_download)
            .showImageForEmptyUri(android.R.drawable.ic_dialog_alert)
            .showImageOnFail(android.R.drawable.stat_notify_error)
            .considerExifParams(true)
            .bitmapConfig(Bitmap.Config.RGB_565)
            .imageScaleType(ImageScaleType.EXACTLY_STRETCHED) //filled width
            .build();
}

}

只需复制上面的代码并将其粘贴到标题为 "CropActivity" 的 class 中。之后在 activity 中打开“Camera”或“Gallery”以获取图像,将下面的代码放在“ onActivityResult()”方法:

 Intent i = new Intent(AddAChild.this, Crop_Activity.class);
                i.putExtra("BitmapImage", filename);
               startActivityForResult(i, CROP_RESULT);

就是这样。你可以走了。