I am trying to develop this simple application that takes images. Everything is fine. The only thing I have is a fixed size oval imageview in the center of my preview. Image capture works fine, but the problem is that I want to capture the image and crop it automatically, which lies inside the oval shape of the view. I donโt want the whole image to be saved, I just want the part of the image that lies inside the form. Now I do not know how to proceed. After several hours spent on Google for solutions, I decided that I had to give up and come here. I donโt understand how I can get only that part of the image that is inside the form (This is a fixed image of an oval shape).
Here is my 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; } }
Second approach: -
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; }
Xml: -
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <FrameLayout android:id="@+id/view" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight=".6" > <SurfaceView android:id="@+id/camera_preview" android:layout_width="match_parent" android:layout_height="match_parent" /> <ImageView android:id="@+id/Img_container" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/eclipce"/> </FrameLayout> <ImageView android:id="@+id/imageview1" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight=".2" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="0dp" android:layout_gravity="center" android:layout_weight=".2" android:orientation="horizontal" > <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Capture" /> </LinearLayout> </LinearLayout>
So please, if anyone knows anything, let me know.
thanks