Android: Free Cropping of Image
Asked Answered
H

1

3

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?

Histrionics answered 26/8, 2013 at 7:54 Comment(2)
Have you used surface view before?Windup
@Windup Not yet...Histrionics
A
25
  • 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);
        }
    }
    
Asymptote answered 27/8, 2013 at 7:5 Comment(5)
I used this but not able to get the Bitmap from cropped area.while saving its contains background with cropped image.Shultz
@noviceAndroid can you tell me how i can get the bitmap from cropped area? and how to avoid extra area around the image while getting bitmapRode
if you want to remove extra part just remove transpert portion of bitmap so you can get orignal crop image .Magnetic
@noviceAndroid How to do this in onDraw instead of creating another bitmap in CropActivity - #36944483.Marable
I want to implement manual, square, circle and shape cropping functionality. So do you have the reference for the complete library?Sanguinolent

© 2022 - 2024 — McMap. All rights reserved.