title: How to do custom image cropping in android
body: <p>In my application, I need to take images from gallery/camera, crop those images, then save the cropped images some where else. The below code does most of that, but cannot crop images to my liking. Using the below code, I can crop images using 4 coordinates, top, bottom, left and right side of image middle coordinates; but I need to crop using 8 coordinates. <a href="https://twitter.com/radhasweety7/status/336806203579580416/photo/1" rel="nofollow">This image</a> shows what I mean.</p>
  
  <pre><code>public class MainActivity extends Activity {
    private static final int PICK_FROM_CAMERA = 1;
    private static final int PICK_FROM_GALLERY = 2;
    private static final int PRESS_OK = 3;
    ImageView imgview;
    String m_path;
    Bitmap m_thePic;
  
    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
  
      imgview = (ImageView) findViewById(R.id.imageView1);
      Button buttonCamera = (Button) findViewById(R.id.btn_take_camera);
      Button buttonGallery = (Button) findViewById(R.id.btn_select_gallery);
      Button buttonOk = (Button) findViewById(R.id.btn_ok);
  
      File folder = new File(Environment.getExternalStorageDirectory().toString() + "/Images/");
      folder.mkdirs();
      buttonCamera.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
          // call android default camera
          Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
          intent.putExtra(MediaStore.EXTRA_OUTPUT,
                          MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString());
          // ******** code for crop image
          intent.putExtra("crop", "true");
          intent.putExtra("aspectX", 0);
          intent.putExtra("aspectY", 0);
          intent.putExtra("outputX", 100);
          intent.putExtra("outputY", 150);
  
          try {
            intent.putExtra("return-data", true);
            startActivityForResult(intent, PICK_FROM_CAMERA);
          } catch (ActivityNotFoundException e) {
            // Do nothing for now
          }
        }
      });
      buttonGallery.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
          // TODO Auto-generated method stub
          Intent intent = new Intent();
          // call android default gallery
          intent.setType("image/*");
          intent.setAction(Intent.ACTION_GET_CONTENT);
          // ******** code for crop image
          intent.putExtra("crop", "true");
          intent.putExtra("aspectX", 0);
          intent.putExtra("aspectY", 0);
          intent.putExtra("outputX", 200);
          intent.putExtra("outputY", 150);
  
          try {
            intent.putExtra("return-data", true);
            startActivityForResult(Intent.createChooser(intent, "Complete action using"), 1);
          } catch (ActivityNotFoundException e) {
            // Do nothing for now
          }
        }
      });
      buttonOk.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
          String m_path = Environment.getExternalStorageDirectory().toString();
          File m_imgDirectory = new File(m_path + "/Images/");
          File m_file = new File(m_path);
          String m_fileid = "nm_tech" + System.currentTimeMillis() + "";
          m_file = new File(m_path, "/Images/" + m_fileid + ".jpg");
          Uri outputFileUri = Uri.fromFile(m_file);
  
          Intent intent = new Intent(MainActivity.this,
                                     ImageGalleryDemoActivity.class);
          intent.putExtra("image", m_fileid);
          startActivity(intent);
          // startActivityForResult(intent,PRESS_OK);
          // call android default camera
          // Toast.makeText(getApplicationContext(), ,1234).show();
        }
      });
    }
  
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      Bundle extras = data.getExtras();
      Bitmap m_thePic = extras.getParcelable("data");
      String m_path = Environment.getExternalStorageDirectory().toString();
      File m_imgDirectory = new File(m_path + "/Images/");
      if (!m_imgDirectory.exists()) {
        m_imgDirectory.mkdir();
      }
      OutputStream m_fOut = null;
      File m_file = new File(m_path);
      m_file.delete();
      String m_fileid = "nm_tech" + System.currentTimeMillis() + "";
      m_file = new File(m_path, "/Images/" + m_fileid + ".jpg");
      try {
        if (!m_file.exists()) {
          m_file.createNewFile();
        }
        m_fOut = new FileOutputStream(m_file);
        Bitmap m_bitmap = m_thePic.copy(Bitmap.Config.ARGB_8888, true);
        m_bitmap.compress(Bitmap.CompressFormat.PNG, 100, m_fOut);
        m_fOut.flush();
        m_fOut.close();
        MediaStore.Images.Media.insertImage(getContentResolver(),
                        m_file.getAbsolutePath(),
                                            m_file.getName(),
                                            m_file.getName());
      } catch (Exception p_e) {
      }
  
      if (requestCode == PICK_FROM_CAMERA) {
        if (extras != null) {
          // Bitmap photo = extras.getParcelable("data");
          imgview.setImageBitmap(m_thePic);
        }
      }
  
      if (requestCode == PICK_FROM_GALLERY) {
        // Bundle extras2 = data.getExtras();
        if (extras != null) {
          imgview.setImageBitmap(m_thePic);
        }
      }
  
      if (requestCode == PRESS_OK) {
        Bundle extras11 = data.getExtras();
        Bitmap bmp = (Bitmap) extras.get("data");
  
        /*
         * Bitmap photo = extras.getParcelable("data");
         * imgview.setImageBitmap(photo); Intent n=new
         * Intent(getApplicationContext(),ImageGalleryDemoActivity.class);
         * n.putExtra("data",photo); startActivity(n);
         */
      }
    }
  }
  </code></pre>