Search code examples
androidandroid-camerasurfaceviewimage-capturecamera-view

How to capture image from custom CameraView in Android?


i need to capture image from required portion of the screen.

capture image from camera.

at that time other screen content as it is.

enter image description here

how is this possible?


Solution

  • try to use Surface View for creating dynamic camera view and set in your required portion.

    following code try

    variables set Class level (Global)

    Button btn_capture;
    Camera camera1;
    SurfaceView surfaceView;
    SurfaceHolder surfaceHolder;
    public static boolean previewing = false;
    

    Following code in onCreate() method

    getWindow().setFormat(PixelFormat.UNKNOWN);
        surfaceView = new SurfaceView(this);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    btn_capture = (Button) findViewById(R.id.button1);
    
    surfaceView.setBackgroundResource(R.drawable.your_background_image);
    
    if(!previewing){
    
            camera1 = Camera.open();
            if (camera1 != null){
                try {
                    camera1.setDisplayOrientation(90);
                    camera1.setPreviewDisplay(surfaceHolder);
                    camera1.startPreview();
                    previewing = true;
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    
    btn_capture.setOnClickListener(new OnClickListener() {
    
            public void onClick(View v) {
                // TODO Auto-generated method stub
    
                if(camera != null)
                {
                    camera1.takePicture(myShutterCallback, myPictureCallback_RAW, myPictureCallback_JPG);
    
                }
            }
        });
    

    Following code put after onCreate() in your class.

    ShutterCallback myShutterCallback = new ShutterCallback(){
    
        public void onShutter() {
            // TODO Auto-generated method stub
        }};
    
    PictureCallback myPictureCallback_RAW = new PictureCallback(){
    
        public void onPictureTaken(byte[] arg0, Camera arg1) {
            // TODO Auto-generated method stub
        }};
    
    PictureCallback myPictureCallback_JPG = new PictureCallback(){
    
        public void onPictureTaken(byte[] arg0, Camera arg1) {
            // TODO Auto-generated method stub
            Bitmap bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);
    
            Bitmap correctBmp = Bitmap.createBitmap(bitmapPicture, 0, 0, bitmapPicture.getWidth(), bitmapPicture.getHeight(), null, true);
    
        }};
    
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub
        if(previewing){
            camera1.stopPreview();
            previewing = false;
        }
    
        if (camera1 != null){
            try {
                camera1.setPreviewDisplay(surfaceHolder);
                camera1.startPreview();
                previewing = true;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
    
    }
    
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
    
            camera1.stopPreview();
            camera1.release();
            camera1 = null;
            previewing = false;
    
    }
    

    in AndroidManifest.xml give user-permissions.

    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-feature android:name="android.hardware.camera" android:required="false"/>
    <uses-feature android:name="android.hardware.camera.front" android:required="false"/>
    

    and also not forgot ( implements SurfaceHolder.Callback ) to the class.