Android: Free Cropping of Image

I want to do free style of cropping on Image...Free Cropping where image can be from Gallery or Can be from Camera...

is there any solution regarding this?


  • Load image from gallery or camera on View (Using Canvas Draw image)

     public class SomeView extends View implements OnTouchListener {
        private Paint paint;
        public static List<Point> points;
        int DIST = 2;
        boolean flgPathDraw = true;
    
        Point mfirstpoint = null;
        boolean bfirstpoint = false;
    
        Point mlastpoint = null;
    
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
                R.drawable.gallery_12);
        Context mContext;
    
        public SomeView(Context c) {
            super(c);
    
            mContext = c;
            setFocusable(true);
            setFocusableInTouchMode(true);
    
            paint = new Paint(Paint.ANTI_ALIAS_FLAG);
            paint.setStyle(Paint.Style.STROKE);
            paint.setPathEffect(new DashPathEffect(new float[] { 10, 20 }, 0));
            paint.setStrokeWidth(5);
            paint.setColor(Color.WHITE);
    
            this.setOnTouchListener(this);
            points = new ArrayList<Point>();
    
            bfirstpoint = false;
        }
    
        public SomeView(Context context, AttributeSet attrs) {
            super(context, attrs);
            mContext = context;
            setFocusable(true);
            setFocusableInTouchMode(true);
    
            paint = new Paint(Paint.ANTI_ALIAS_FLAG);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(2);
            paint.setColor(Color.WHITE);
    
            this.setOnTouchListener(this);
            points = new ArrayList<Point>();
            bfirstpoint = false;
    
        }
    
        public void onDraw(Canvas canvas) {
            canvas.drawBitmap(bitmap, 0, 0, null);
    
            Path path = new Path();
            boolean first = true;
    
            for (int i = 0; i < points.size(); i += 2) {
                Point point = points.get(i);
                if (first) {
                    first = false;
                    path.moveTo(point.x, point.y);
                } else if (i < points.size() - 1) {
                    Point next = points.get(i + 1);
                    path.quadTo(point.x, point.y, next.x, next.y);
                } else {
                    mlastpoint = points.get(i);
                    path.lineTo(point.x, point.y);
                }
            }
            canvas.drawPath(path, paint);
        }
    
        public boolean onTouch(View view, MotionEvent event) {
            // if(event.getAction() != MotionEvent.ACTION_DOWN)
            // return super.onTouchEvent(event);
    
            Point point = new Point();
            point.x = (int) event.getX();
            point.y = (int) event.getY();
    
            if (flgPathDraw) {
    
                if (bfirstpoint) {
    
                    if (comparepoint(mfirstpoint, point)) {
                        // points.add(point);
                        points.add(mfirstpoint);
                            flgPathDraw = false;
                                            showcropdialog();
                    } else {
                        points.add(point);
                    }
                } else {
                    points.add(point);
                }
    
                if (!(bfirstpoint)) {
    
                    mfirstpoint = point;
                    bfirstpoint = true;
                }
            }
    
            invalidate();
            Log.e("Hi  ==>", "Size: " + point.x + " " + point.y);
    
            if (event.getAction() == MotionEvent.ACTION_UP) {
                Log.d("Action up*******~~~~~~~>>>>", "called");
                mlastpoint = point;
                if (flgPathDraw) {
                    if (points.size() > 12) {
                        if (!comparepoint(mfirstpoint, mlastpoint)) {
                            flgPathDraw = false;
                            points.add(mfirstpoint);
                            showcropdialog();
                        }
                    }
                }
            }
    
            return true;
        }
    
        private boolean comparepoint(Point first, Point current) {
            int left_range_x = (int) (current.x - 3);
            int left_range_y = (int) (current.y - 3);
    
            int right_range_x = (int) (current.x + 3);
            int right_range_y = (int) (current.y + 3);
    
            if ((left_range_x < first.x && first.x < right_range_x)
                    && (left_range_y < first.y && first.y < right_range_y)) {
                if (points.size() < 10) {
                    return false;
                } else {
                    return true;
                }
            } else {
                return false;
            }
    
        }
    
        public void fillinPartofPath() {
            Point point = new Point();
            point.x = points.get(0).x;
            point.y = points.get(0).y;
    
            points.add(point);
            invalidate();
        }
    
        public void resetView() {
            points.clear();
            paint.setColor(Color.WHITE);
            paint.setStyle(Style.STROKE);
            flgPathDraw = true;
            invalidate();
        }
    
        private void showcropdialog() {
            DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent;
                    switch (which) {
                    case DialogInterface.BUTTON_POSITIVE:
                        // Yes button clicked
                        // bfirstpoint = false;
    
                        intent = new Intent(mContext, CropActivity.class);
                        intent.putExtra("crop", true);
                        mContext.startActivity(intent);
                        break;
    
                    case DialogInterface.BUTTON_NEGATIVE:
                        // No button clicked
    
                        intent = new Intent(mContext, CropActivity.class);
                        intent.putExtra("crop", false);
                        mContext.startActivity(intent);
    
                        bfirstpoint = false;
                        // resetView();
    
                        break;
                    }
                }
            };
    
            AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
            builder.setMessage("Do you Want to save Crop or Non-crop image?")
                    .setPositiveButton("Crop", dialogClickListener)
                    .setNegativeButton("Non-crop", dialogClickListener).show()
                    .setCancelable(false);
        }
       }
    
    
    class Point {
    
        public float dy;
        public float dx;
        float x, y;
    
    @Override
    public String toString() {
        return x + ", " + y;
        }
    }
    
  • MainActivity Which call Someview to draw/load image

    public class MainActivity_ extends Activity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        setContentView(new SomeView(MainActivity_.this));
    }
    
    }
    
  • CropActivity : which load crop image on bitmap.

     public class CropActivity extends Activity {
    
        ImageView compositeImageView;
        boolean crop;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.cropview);
    
            Bundle extras = getIntent().getExtras();
            if (extras != null) {
                crop = extras.getBoolean("crop");
            }
            int widthOfscreen = 0;
            int heightOfScreen = 0;
    
            DisplayMetrics dm = new DisplayMetrics();
            try {
                getWindowManager().getDefaultDisplay().getMetrics(dm);
            } catch (Exception ex) {
            }
            widthOfscreen = dm.widthPixels;
            heightOfScreen = dm.heightPixels;
    
            compositeImageView = (ImageView) findViewById(R.id.our_imageview);
    
            Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(),
                    R.drawable.gallery_12);
    
            Bitmap resultingImage = Bitmap.createBitmap(widthOfscreen,
                    heightOfScreen, bitmap2.getConfig());
    
            Canvas canvas = new Canvas(resultingImage);
            Paint paint = new Paint();
            paint.setAntiAlias(true);
    
            Path path = new Path();
            for (int i = 0; i < SomeView.points.size(); i++) {
                path.lineTo(SomeView.points.get(i).x, SomeView.points.get(i).y);
            }
            canvas.drawPath(path, paint);
            if (crop) {
                paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
    
            } else {
                paint.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT));
            }
            canvas.drawBitmap(bitmap2, 0, 0, paint);
            compositeImageView.setImageBitmap(resultingImage);
        }
    }