Android: Free Cropping of Image

前端 未结 1 741
粉色の甜心
粉色の甜心 2020-11-28 12:47

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

相关标签:
1条回答
  • 2020-11-28 13:14
    • 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);
          }
      }
      
    0 讨论(0)
提交回复
热议问题