Android: Free Cropping of Image
I want to do free style of cropping on Image... 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); } }