简体   繁体   中英

how to crop image from gallery and set in imageview

I am cropping an image from the gallery but cannot able to set that cropped image in imageView , final image set as default image I mean without cropped so how to set Cropped image in ImageView

this is image Picker from gallery

 newPostImg.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            galIntent=new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(Intent.createChooser(galIntent,"select image"),2);
        }
    });

This is for crop image

private void CropImage() {
    try {
        CropIntent = new Intent("com.android.camera.action.CROP");
        CropIntent.setDataAndType(postImageUri,"image/*");
        CropIntent.putExtra("crop","true");
        CropIntent.putExtra("outputX",180);
        CropIntent.putExtra("outputY",180);
        CropIntent.putExtra("aspectX",3);
        CropIntent.putExtra("aspectY",4);
        CropIntent.putExtra("scaleUpIfNeeded",true);
        CropIntent.putExtra("return-data",true);

        startActivityForResult(CropIntent,1);

    }
    catch (ActivityNotFoundException ex)
    {

    }
}

This is onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {


    if (requestCode == 0&&resultCode ==RESULT_OK)
        CropImage();
        if (requestCode==2){
            if (data!=null){
                postImageUri=data.getData();
                CropImage();
                newPostImg.setImageURI(postImageUri);

            }
        }

}

And this is my permission

 <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA"/>

and this is imageView xml

 <ImageView
        android:layout_margin="10dp"
        android:id="@+id/newPostImg"
        android:layout_width="match_parent"
        android:layout_height="250dp"
       android:src="@drawable/default1" />
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {


        if (resultCode == RESULT_OK) {

            if (requestCode == 2) {
                if (data != null) {
                    postImageUri = data.getData();
                    CropImage();
                }
            } else if (requestCode == 1) {
                Bundle extras = data.getExtras();
                Bitmap bitmap= extras.getParcelable("data");
                newPostImg.setImageBitmap(bitmap);
            }
        }
    }


}

You should set Image on CropIntent's result and not on cameraIntent's result.

 Uri imageUri = Uri.parse(mCurrentPhotoPath);
  Intent intent = new Intent(mContext, Crop_Activity.class);
  intent.putExtra("imageUri", imageUri.toString());
  startActivityForResult(intent, 105);

Here is the code for crop activity

public class Crop_Activity extends BaseActivity implements CropImageView.OnSetImageUriCompleteListener, CropImageView.OnCropImageCompleteListener, View.OnClickListener {

    private CropImageView mCropImageView;
    private ProgressDialog dialog;
    int type;
    private Uri imageUri;
    private Bitmap cropped;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.crop_activity);

        setScreenName("Crop Image screen");

        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            imageUri = Uri.parse(getIntent().getStringExtra("imageUri"));
        }

        //====Initialize Here====//
        init();

        //====Set CropImageView Here====//
        setCropImageView();

    }

    void init() {
        dialog = new ProgressDialog(Crop_Activity.this);
        dialog.setCancelable(false);
        dialog.setMessage("Cropping Image...");
        Func.set_title_to_actionbar("Crop Image", "", "", Crop_Activity.this, (Toolbar) findViewById(R.id.toolbar), true, 8, 8, Crop_Activity.this);
        mCropImageView = (CropImageView) findViewById(R.id.CropImageView);
    }

    void setCropImageView() {
        mCropImageView.setOnSetImageUriCompleteListener(this);
        mCropImageView.setOnCropImageCompleteListener(this);
        mCropImageView.setFixedAspectRatio(true);
        mCropImageView.setImageUriAsync(imageUri);
        mCropImageView.setShowProgressBar(false);
        mCropImageView.setFixedAspectRatio(true);
        mCropImageView.setAspectRatio(10, 10);
    }

    @Override
    public boolean onCreateOptionsMenu(final Menu menu) {
        getMenuInflater().inflate(R.menu.menu_crop, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == android.R.id.home) {
            onBackPressed();
            finish();
            return true;
        }
        if (id == R.id.btn_ok) {
            mCropImageView.getCroppedImageAsync();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onSetImageUriComplete(CropImageView view, Uri uri, Exception error) {
    }

    @Override
    public void onClick(View view) {

    }

    class CropingImageAsync extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {
            Constants.Photo = cropped;
            Intent i = new Intent();
            setResult(RESULT_OK, i);
            finish();
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            dialog.dismiss();
            Intent intent = new Intent();
            setResult(RESULT_OK, intent);
            finish();
        }
    }

    @Override
    public void onCropImageComplete(CropImageView view, CropImageView.CropResult result) {
        handleCropResult(result);
    }

    private void handleCropResult(CropImageView.CropResult result) {
        if (result.getError() == null) {
            Bitmap bitmap = result.getBitmap();
            if (bitmap != null) {
                cropped = bitmap;
                if (cropped != null) {
                    new CropingImageAsync().execute();
                }
            }
        } else {
            Log.e("AIC", "Failed to crop image", result.getError());
        }
    }
}

Here is the XML for crop activity

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:id="@+id/line1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.theartofdev.edmodo.cropper.CropImageView
        android:id="@+id/CropImageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:cropInitialCropWindowPaddingRatio="0" />

</LinearLayout>

Dependency for cropping

compile 'com.theartofdev.edmodo:android-image-cropper:2.3.+'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM