裁剪不适用于图库图像

Crop does not work for gallery images

我正在使用以下代码从相机和图库中裁剪图像:

private void doCrop() {
    final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();

    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setType("image/*");

    List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 0);

    int size = list.size();

    if (size == 0) {
        Toast.makeText(this, getApplicationContext().getString(R.string.crop_unavailable), Toast.LENGTH_SHORT).show();
        // return
    } else {
        intent.setData(mImageCaptureUri);
        int y = 200;
        if(lastSelect == 1 || lastSelect == 2 || lastSelect == 3 || lastSelect == 4){
            y = (int) (200 * 0.5697329376854599);
        }
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", y);
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", true);

        if (size == 1) {
            Intent i = new Intent(intent);
            ResolveInfo res = list.get(0);

            i.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));

            startActivityForResult(i, CROP_FROM_CAMERA);
        } else {
            for (ResolveInfo res: list) {
                final CropOption co = new CropOption();

                co.title = getPackageManager().getApplicationLabel(res.activityInfo.applicationInfo);
                co.icon = getPackageManager().getApplicationIcon(res.activityInfo.applicationInfo);
                co.appIntent = new Intent(intent);

                co.appIntent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));

                cropOptions.add(co);
            }

            CropOptionAdapter adapter = new CropOptionAdapter(getApplicationContext(), cropOptions);

            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle(getApplicationContext().getString(R.string.select_crop_app));
            builder.setAdapter(adapter, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int item) {
                    startActivityForResult(cropOptions.get(item).appIntent, CROP_FROM_CAMERA);
                }
            });

            builder.setOnCancelListener(new DialogInterface.OnCancelListener() {

                @Override
                public void onCancel(DialogInterface dialog) {

                    if (mImageCaptureUri != null) {
                        getContentResolver().delete(mImageCaptureUri, null, null);
                        mImageCaptureUri = null;
                    }
                }
            });

            AlertDialog alert = builder.create();

            alert.show();
        }
    }
}

虽然它可以很好地裁剪来自相机的图片,但不适用于图库图像。它总是 returns 从图库中选择的基本图片。

onActivityResult :

if (resultCode != RESULT_OK)
            return;
        switch (requestCode) {
            case PICK_FROM_CAMERA:
                doCrop();
                break;
            case PICK_FROM_FILE:
                mImageCaptureUri = data.getData();
                doCrop();
                break;
            case CROP_FROM_CAMERA:
                Bundle extras = data.getExtras();
                if (extras != null) {
                    photo = extras.getParcelable("data");
//                    imgImage4.setImageBitmap(photo);
                    int w = (int) (UIHelpers.width * 0.15);
                    File f = new File(mImageCaptureUri.getPath());
                    if (f.exists()) {
                    // f.delete();
                    }
                    String imageDir = getRealPathFromURI(mImageCaptureUri);
                            txtSelectLogoNj.setVisibility(View.GONE);
                            rlLogoNj.setVisibility(View.VISIBLE);
                            image5 = imageDir;
                            App.sharedpreferences = getSharedPreferences(App.MyPREFERENCES, Context.MODE_PRIVATE);
                            App.editor = App.sharedpreferences.edit();
                            App.editor.putString("IMAGE5", imageDir);
                            App.editor.commit();
                    }
                }
                break;
        }

我该如何解决?

嗨,你能试试这个吗,

@Override
    public void onActivityResult(final int requestCode, int resultCode,
            Intent data) {
        try {
            switch (requestCode) {
            case GALLERY_PIC_REQUEST:
                if (resultCode == RESULT_OK) {
                    try {
                        picUri = data.getData();
                        System.out.println("Image Path::>  "+picUri.getPath());
                        performCrop();
                    } catch (Exception e) {
                        ShowDialog_Ok("Error", "Couldn't load photo");
                    }
                }
                break;
            case CAMERA_PIC_REQUEST:
                if (resultCode == RESULT_OK) {
                    try {
                        picUri = data.getData();
                        System.out.println("Image Path::>  "+picUri.getPath());
                        performCrop();
                    } catch (Exception e) {
                        ShowDialog_Ok("Error", "Couldn't load photo");
                    }
                }
                break;
            case CROP_PIC_REQUEST:
                Bitmap bitmap;
                String path = "";
                if (resultCode == RESULT_OK) {
                    String oldPath = fashionlyPreferences.getImagePath();
                    try {
                        picUri = data.getData();
                        path = Helper.GetPathFromURI(context, picUri);
                        bitmap  = BitmapFactory.decodeFile(path);
                        Img_View.setImageBitmap(bitmap);
                    } catch (Exception e) {
                        ShowDialog_Ok("Error", "Couldn't load photo");
                    }
                }

                break;
            }
        } catch (Exception e) {
        }
    }

//裁剪函数

private void performCrop() {
                // take care of exceptions
                try {
                    if (picUri!=null) {
                         Intent cropIntent = new Intent("com.android.camera.action.CROP");
                         cropIntent.setDataAndType(picUri, "image/*");
                         cropIntent.putExtra("crop", "true");
                         cropIntent.putExtra("scale", true);
                         cropIntent.putExtra("aspectX", 0);
                         cropIntent.putExtra("aspectY", 0);
                        //cropIntent.putExtra("outputX", 400); 
                        // cropIntent.putExtra("outputY", 400);
                         cropIntent.putExtra("return-data", false);
                         startActivityForResult(cropIntent, CROP_PIC_REQUEST);
                    }
                }
                // respond to users whose devices do not support the crop action
                catch (ActivityNotFoundException anfe) {
                    Toast.makeText(this, "This device doesn't support the crop action!", Toast.LENGTH_SHORT).show();
                }
         }

试试这个工作代码

按钮点击拍照

dialog.show();

在 Oncreate() 中添加这个

captureImageInitialization();

尝试一下它会起作用

// for camera

    private void captureImageInitialization() {
        try {
            /**
             * a selector dialog to display two image source options, from
             * camera ‘Take from camera’ and from existing files ‘Select from
             * gallery’
             */
            final String[] items = new String[] { "Take from camera",
                    "Select from gallery" };
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    android.R.layout.select_dialog_item, items);
            AlertDialog.Builder builder = new AlertDialog.Builder(this);

            builder.setTitle("Select Image");
            builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int item) { // pick
                                                                        // from
                                                                        // camera
                    if (item == 0) {
                        /**
                         * To take a photo from camera, pass intent action
                         * ‘MediaStore.ACTION_IMAGE_CAPTURE‘ to open the camera
                         * app.
                         */
                        Intent intent = new Intent(
                                MediaStore.ACTION_IMAGE_CAPTURE);

                        /**
                         * Also specify the Uri to save the image on specified
                         * path and file name. Note that this Uri variable also
                         * used by gallery app to hold the selected image path.
                         */
                        mImageCaptureUri = Uri.fromFile(new File(Environment
                                .getExternalStorageDirectory(), "tmp_avatar_"
                                + String.valueOf(System.currentTimeMillis())
                                + ".jpg"));

                        intent.putExtra(
                                android.provider.MediaStore.EXTRA_OUTPUT,
                                mImageCaptureUri);

                        try {
                            intent.putExtra("return-data", true);
                            // intent.putExtra("return-data1", true);

                            startActivityForResult(intent, PICK_FROM_CAMERA);
                            // finish();
                        } catch (ActivityNotFoundException e) {
                            e.printStackTrace();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    } else {
                        // pick from file
                        /**
                         * To select an image from existing files, use
                         * Intent.createChooser to open image chooser. Android
                         * will automatically display a list of supported
                         * applications, such as image gallery or file manager.
                         */
                        /*
                         * Intent intent = new Intent();
                         * 
                         * intent.setType("image/*");
                         * intent.setAction(Intent.ACTION_GET_CONTENT);
                         * 
                         * startActivityForResult(Intent.createChooser(intent,
                         * "Complete action using"), PICK_FROM_FILE);
                         */

                        try {


                            Intent intent = new Intent();
                            intent = new Intent(Intent.ACTION_PICK);
                            intent.setType("*/*");
                            intent.putExtra(
                                    android.provider.MediaStore.EXTRA_OUTPUT,
                                    mImageCaptureUri);
                            startActivityForResult(Intent.createChooser(intent,
                                    "Complete action using"), PICK_FROM_FILE);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    }
                }
            });

            dialog = builder.create();

        } catch (Exception e) {

            e.printStackTrace();

        } catch (OutOfMemoryError o) {
            o.printStackTrace();
        }

    }

    public class CropOptionAdapter extends ArrayAdapter<CropOption> {

        private ArrayList<CropOption> mOptions;
        private LayoutInflater mInflater;

        public CropOptionAdapter(Context context, ArrayList<CropOption> options) {
            super(context, R.layout.crop_selector, options);

            mOptions = options;

            mInflater = LayoutInflater.from(context);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup group) {
            // new try
            try {

                if (convertView == null)
                    convertView = mInflater.inflate(R.layout.crop_selector,
                            null);

                CropOption item = mOptions.get(position);

                if (item != null) {
                    ((ImageView) convertView.findViewById(R.id.iv_icon))
                            .setImageDrawable(item.icon);
                    ((TextView) convertView.findViewById(R.id.tv_name))
                            .setText(item.title);

                    return convertView;
                }

                return null;

            } catch (Exception e) {

                e.printStackTrace();

            }

            if (convertView == null)
                convertView = mInflater.inflate(R.layout.crop_selector, null);

            CropOption item = mOptions.get(position);

            if (item != null) {
                ((ImageView) convertView.findViewById(R.id.iv_icon))
                        .setImageDrawable(item.icon);
                ((TextView) convertView.findViewById(R.id.tv_name))
                        .setText(item.title);

                return convertView;
            }

            return null;
        }
    }

    public class CropOption {
        public CharSequence title;
        public Drawable icon;
        public Intent appIntent;
    }



// Method for Crop
            private void doCrop() {

                try {
                    final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();
                    /**
                     * Open image crop app by starting an intent
                     * ‘com.android.camera.action.CROP‘.
                     */
                    Intent intent = new Intent("com.android.camera.action.CROP");
                    intent.setType("image/*");

                    /**
                     * Check if there is image cropper app installed.
                     */
                    List<ResolveInfo> list = getPackageManager().queryIntentActivities(
                            intent, 0);

                    int size = list.size();

                    /**
                     * If there is no image cropper app, display warning message
                     */
                    if (size == 0) {

                        Toast.makeText(this, "Can not find image crop app",
                                Toast.LENGTH_SHORT).show();

                        return;
                    } else {
                        /**
                         * Specify the image path, crop dimension and scale
                         */
                        intent.setData(mImageCaptureUri);

                        intent.putExtra("outputX", 300);
                        intent.putExtra("outputY", 300);
                        intent.putExtra("aspectX", 1);
                        intent.putExtra("aspectY", 1);
                        intent.putExtra("scale", true);
                        intent.putExtra("return-data", true);

                        /**
                         * There is posibility when more than one image cropper app
                         * exist, so we have to check for it first. If there is only one
                         * app, open then app.
                         */

                        if (size == 1) {
                            Intent i = new Intent(intent);
                            ResolveInfo res = list.get(0);

                            i.setComponent(new ComponentName(
                                    res.activityInfo.packageName, res.activityInfo.name));

                            startActivityForResult(i, CROP_FROM_CAMERA);
                        } else {
                            /**
                             * If there are several app exist, create a custom chooser
                             * to let user selects the app.
                             */
                            for (ResolveInfo res : list) {
                                final CropOption co = new CropOption();

                                co.title = getPackageManager().getApplicationLabel(
                                        res.activityInfo.applicationInfo);
                                co.icon = getPackageManager().getApplicationIcon(
                                        res.activityInfo.applicationInfo);
                                co.appIntent = new Intent(intent);

                                co.appIntent.setComponent(new ComponentName(
                                        res.activityInfo.packageName,
                                        res.activityInfo.name));

                                cropOptions.add(co);
                            }

                            CropOptionAdapter adapter = new CropOptionAdapter(
                                    getApplicationContext(), cropOptions);

                            AlertDialog.Builder builder = new AlertDialog.Builder(this);
                            builder.setTitle("Choose Crop App");
                            builder.setAdapter(adapter,
                                    new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog,
                                                int item) {
                                            startActivityForResult(
                                                    cropOptions.get(item).appIntent,
                                                    CROP_FROM_CAMERA);
                                        }
                                    });

                            builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
                                @Override
                                public void onCancel(DialogInterface dialog) {

                                    if (mImageCaptureUri != null) {
                                        getContentResolver().delete(mImageCaptureUri,
                                                null, null);
                                        mImageCaptureUri = null;
                                    }
                                }
                            });

                            AlertDialog alert = builder.create();

                            alert.show();
                        }
                    }
                }

                catch (Exception e) {

                    Log.e("Error", "ERROR IN CODE:" + e.toString());

                    e.printStackTrace();

                }
            }

onActivityResult :

      if (requestCode == PICK_FROM_CAMERA) {

                doCrop();

            }
    else if (requestCode == PICK_FROM_FILE) {
                mImageCaptureUri = intent.getData();

                doCrop();
            }       
else if (requestCode == CROP_FROM_CAMERA) {

                Bundle extras = intent.getExtras();
                /**
                 * After cropping the image, get the bitmap of the cropped image and
                 * display it on imageview.
                 */


                if (extras != null) {

                    Bitmap photo = extras.getParcelable("data");
                    // Camera Output



                        viewImage.setImageBitmap(photo);

                        ContextWrapper cw = new ContextWrapper(getApplicationContext());
                        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
                        String imageFileName = "JPEG_" + timeStamp + "_";
                        File directory1 = cw.getDir("Picture",Context.MODE_PRIVATE);
                        File mypath1 = new File(directory1, imageFileName + ".png");
                        picturepath = mypath1.toString();

                        // FileOutputStream fos = null;
                        try {
                            // fos = openFileOutput(filename, Context.MODE_PRIVATE);
                            System.out.println("mypath = " + mypath1);
                            fos = new FileOutputStream(mypath1);

                            // Use the compress method on the BitMap object to write
                            // image to the OutputStream
                            photo.compress(Bitmap.CompressFormat.PNG, 100, fos);

                            try {
                                fos.flush();
                                fos.close();


                            } catch (IOException e1) {

                                e1.printStackTrace();
                            }
                            try {
                                fos.close();
                            } catch (IOException e) {

                                e.printStackTrace();
                            }
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        }



                }
            }

请使用库项目从相机或图库裁剪图像。 完美它会起作用。

https://github.com/biokys/cropimage