title: Take the picture of what is inside the overlay bounds
body: <p>I'm trying to develop this simple app that takes pictures . Everything is fine. The only thing I  have a <strong>fixed size oval shaped</strong> imageview in center of my preview.Capturing of image is working fine but the problem is 
  I want to capture image and crop it automatically which lies inside the oval shaped imageview.I do not want whole image to be saved , i just want the portion of image which lies inside the shape.
  Now, I don't know how to proceed.After hours spent on Google for solutions I decided that I had to give up and come here.I am not getting that how can i get only that portion of image which lies inside the shape(That fixed oval shape image).</p>
  
  <p>Here is my code :-</p>
  
  <pre><code> public class MainActivity extends Activity implements SurfaceHolder.Callback {
  
      Camera camera;
      SurfaceView surfaceView;
      SurfaceHolder surfaceHolder;
      boolean cameraview = false;
      LayoutInflater inflater = null;
      private ImageView ImgContainer;
      private Button btn;
      private ImageView mIvCaptureImage;
      FrameLayout frameLayout;
  
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  
          getWindow().setFormat(PixelFormat.UNKNOWN);
          frameLayout = (FrameLayout) findViewById(R.id.view);
          surfaceView = (SurfaceView) findViewById(R.id.camera_preview);
          ImgContainer = (ImageView) findViewById(R.id.Img_container);
          surfaceHolder = surfaceView.getHolder();
          surfaceHolder.addCallback(this);
          surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
          // GuideBox box = new GuideBox(MainActivity.this);
          // llContainer.addView(box, new LayoutParams(LayoutParams.WRAP_CONTENT,
          // LayoutParams.WRAP_CONTENT));
          btn = (Button) findViewById(R.id.button);
          mIvCaptureImage = (ImageView) findViewById(R.id.imageview1);
          btn.setOnClickListener(new OnClickListener() {
  
              @SuppressWarnings("deprecation")
              @Override
              public void onClick(View v) {
                  if (camera != null) {
                      camera.takePicture(myShutterCallback,
                              myPictureCallback_RAW, myPictureCallback_JPG);
  
                  }
  
              }
          });
  
      }
  
      @TargetApi(Build.VERSION_CODES.GINGERBREAD)
      @SuppressWarnings("deprecation")
      @Override
      public void surfaceChanged(SurfaceHolder holder, int format, int width,
              int height) {
          // TODO Auto-generated method stub
          if (cameraview) {
              camera.stopPreview();
              cameraview = false;
          }
  
          if (camera != null) {
              try {
                  setCameraDisplayOrientation(this,
                          CameraInfo.CAMERA_FACING_BACK, camera);
                  camera.setPreviewDisplay(surfaceHolder);
                  camera.startPreview();
                  cameraview = true;
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }
  
      @TargetApi(Build.VERSION_CODES.GINGERBREAD)
      @SuppressWarnings("deprecation")
      private void setCameraDisplayOrientation(Activity activity, int cameraId,
              android.hardware.Camera camera) {
          android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
          android.hardware.Camera.getCameraInfo(cameraId, info);
          int rotation = activity.getWindowManager().getDefaultDisplay()
                  .getRotation();
          int degrees = 0;
          switch (rotation) {
          case Surface.ROTATION_0:
              degrees = 0;
              break;
          case Surface.ROTATION_90:
              degrees = 90;
              break;
          case Surface.ROTATION_180:
              degrees = 180;
              break;
          case Surface.ROTATION_270:
              degrees = 270;
              break;
          }
  
          int result;
          if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
              result = (info.orientation + degrees) % 360;
              result = (360 - result) % 360; // compensate the mirror
          } else { // back-facing
              result = (info.orientation - degrees + 360) % 360;
          }
          camera.setDisplayOrientation(result);
      }
  
      ShutterCallback myShutterCallback = new ShutterCallback() {
  
          public void onShutter() {
              // TODO Auto-generated method stub
          }
      };
  
      PictureCallback myPictureCallback_RAW = new PictureCallback() {
  
          @Override
          public void onPictureTaken(byte[] data, android.hardware.Camera camera) {
              // TODO Auto-generated method stub
  
          }
      };
  
      PictureCallback myPictureCallback_JPG = new PictureCallback() {
  
          @Override
          public void onPictureTaken(byte[] data, android.hardware.Camera camera) {
              // TODO Auto-generated method stub
              Rect rc = getViewPositionRelative();
              Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data, 0,
                      data.length);
              Matrix mat = new Matrix();
              mat.postRotate(90);
              Bitmap correctBmp = Bitmap.createBitmap(bitmapPicture, rc.left,
                      rc.top, ImgContainer.getWidth(), ImgContainer.getHeight(),
                      mat, true);
              // Bitmap circularBitmap = ImageConverter.getRoundedCornerBitmap(
              // correctBmp, 100);
              mIvCaptureImage.setImageBitmap(correctBmp);
          }
      };
  
      public Rect getViewPositionRelative() {
          // Locate on screen
          int[] location = new int[2];
          ImgContainer.getLocationOnScreen(location); 
  
          Rect rect = new Rect();
          rect.left = location[0];
          rect.top = location[1];
          rect.right = rect.left + ImgContainer.getWidth();
          rect.bottom = rect.top + ImgContainer.getHeight();
          return rect;
      }
  
      @Override
      public void surfaceCreated(SurfaceHolder holder) {
          // TODO Auto-generated method stub
          camera = Camera.open();
      }
  
      @Override
      public void surfaceDestroyed(SurfaceHolder holder) {
          // TODO Auto-generated method stub
          camera.stopPreview();
          camera.release();
          camera = null;
          cameraview = false;
      }
  }
  </code></pre>
  
  <p>Second Approach :-</p>
  
  <pre><code>PictureCallback myPictureCallback_JPG = new PictureCallback() {
  
      @Override
      public void onPictureTaken(byte[] data, android.hardware.Camera camera) {
          Boolean isSDPresent = android.os.Environment
                  .getExternalStorageState().equals(
                          android.os.Environment.MEDIA_MOUNTED);
  
          String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
                  Locale.getDefault()).format(new Date());
  
          // checking for SD card
          if (isSDPresent) {
              mediaStorageDir = new File(Environment
                      .getExternalStorageDirectory().getAbsolutePath(),
                      IMAGE_DIRECTORY_NAME);
  
              mediaFile = new File(mediaStorageDir.getPath() + File.separator
                      + "IMG_" + timeStamp + ".jpg");
  
              // Create the storage directory if it does not exist
              if (!mediaStorageDir.exists()) {
                  if (!mediaStorageDir.mkdirs()) {
                  }
              }
  
              try {
                  Bitmap userImage = BitmapFactory.decodeByteArray(data, 0,
                          data.length);
  
                  // set file out stream
                  FileOutputStream out = new FileOutputStream(mediaFile);
                  // set compress format quality and stream
                  userImage.compress(Bitmap.CompressFormat.JPEG, 100, out);
  
                  ByteArrayOutputStream baos = new ByteArrayOutputStream();
                  userImage.compress(Bitmap.CompressFormat.JPEG, 100, baos);
  
                  try {
                      out.close();
                  } catch (IOException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
              } catch (FileNotFoundException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
          } else {
              Toast.makeText(getApplicationContext(),
                      "Please insert SD card !", Toast.LENGTH_LONG).show();
  
          }
          if (mediaStorageDir.exists()) {
              getPathOfCapturedImage();
          }
  
      }
  };
  
  private void getPathOfCapturedImage() {
      final String ImagePath = mediaFile.getAbsolutePath();
      Bitmap bitmap = BitmapFactory.decodeFile(ImagePath);
  
      int bitWidth = bitmap.getWidth();
      int bitHeight = bitmap.getHeight();
  
      // 3. Size of camera preview on screen
      int preWidth = surfaceView.getWidth();
      int preHeight = surfaceView.getHeight();
  
      Rect rc = getViewPositionRelative();
      Matrix mat = new Matrix();
      mat.postRotate(90);
  
      int startx = rc.left * bitWidth / preWidth;
      int starty = rc.top * bitHeight / preHeight;
      int endx = rc.right * bitWidth / preWidth;
      int endy = rc.bottom * bitHeight / preHeight;
  
      Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, startx, starty,
              endx, endy);
      mIvCaptureImage.setImageBitmap(resizedBitmap);
  }
  
  public Rect getViewPositionRelative() {
      // Locate on screen
      int[] location = new int[2];
      ImgContainer.getLocationOnScreen(location);
  
      Rect rect = new Rect();
      rect.left = location[0];
      rect.top = location[1];
      rect.right = rect.left - ImgContainer.getWidth();
      rect.bottom = rect.top - ImgContainer.getHeight();
      return rect;
  }
  
  @Override
  public void surfaceCreated(SurfaceHolder holder) {
      // TODO Auto-generated method stub
      camera = Camera.open();
  }
  
  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
      // TODO Auto-generated method stub
      camera.stopPreview();
      camera.release();
      camera = null;
      cameraview = false;
  }
  </code></pre>
  
  <p>Xml :-</p>
  
  <p><div class="snippet" data-lang="js" data-hide="false" data-console="true">
  <div class="snippet-code">
  <pre class="snippet-code-html lang-html prettyprint-override"><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical" &gt;
  
      &lt;FrameLayout
          android:id="@+id/view"
          android:layout_width="match_parent"
          android:layout_height="0dp"
          android:layout_weight=".6" &gt;
  
          &lt;SurfaceView
              android:id="@+id/camera_preview"
              android:layout_width="match_parent"
              android:layout_height="match_parent" /&gt;
  
          &lt;ImageView
              android:id="@+id/Img_container"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center"
              android:background="@drawable/eclipce"/&gt;
      &lt;/FrameLayout&gt;
  
      &lt;ImageView
          android:id="@+id/imageview1"
          android:layout_width="wrap_content"
          android:layout_height="0dp"
          android:layout_weight=".2" /&gt;
  
      &lt;LinearLayout
          android:layout_width="wrap_content"
          android:layout_height="0dp"
          android:layout_gravity="center"
          android:layout_weight=".2"
          android:orientation="horizontal" &gt;
  
          &lt;Button
              android:id="@+id/button"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center"
              android:text="Capture" /&gt;
      &lt;/LinearLayout&gt;
  
  &lt;/LinearLayout&gt;</code></pre>
  </div>
  </div>
  </p>
  
  <p>So please, if someone knows anything, let me know.</p>
  
  <p>Thanks</p>