Cdacians

Cdacians
Cdacians

Tuesday, 14 August 2012

Android : Creating and Saving an Overlay on Image captured by Camera.


CameraScreenActivity.java:


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.widget.RelativeLayout.LayoutParams;


public class CameraScreenActivity extends Activity implements SurfaceHolder.Callback
{
  private Camera camera = null;
  private SurfaceView cameraSurfaceView = null;
  private SurfaceHolder cameraSurfaceHolder = null;
  private boolean previewing = false;

  private Display display = null;


  private static int wid = 0, hgt = 0;

  private LayoutInflater layoutInflater = null;
  private View cameraViewControl = null;
  private LayoutParams layoutParamsControl = null;

  private Button btnCapture = null;

  @Override
  protected void onCreate(Bundle savedInstanceState) 
  {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);


    setRequestedOrientation(ActivityInfo.
                                         SCREEN_ORIENTATION_LANDSCAPE);
    
    display = getWindowManager().getDefaultDisplay(); 
    wid = display.getWidth();
    hgt = display.getHeight();
    
    getWindow().setFormat(PixelFormat.TRANSLUCENT);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(
                         WindowManager.LayoutParams.FLAG_FULLSCREEN,
                         WindowManager.LayoutParams.FLAG_FULLSCREEN);
         
    setContentView(R.layout.homescreen);
    
    cameraSurfaceView = (SurfaceView)
                                       findViewById(R.id.cameraSurfaceView);
    cameraSurfaceHolder = cameraSurfaceView.getHolder();
    cameraSurfaceHolder.addCallback(this);
    cameraSurfaceHolder.setType(SurfaceHolder.
                                                 SURFACE_TYPE_PUSH_BUFFERS);
         
    layoutInflater = LayoutInflater.from(getBaseContext());
    layoutParamsControl = new LayoutParams(
                                                        LayoutParams.FILL_PARENT,
                                                        LayoutParams.FILL_PARENT);
    
    cameraViewControl = layoutInflater.inflate
                                                   (R.layout.cambutton, null);     
    this.addContentView(cameraViewControl, layoutParamsControl);
    
    cameraViewControl = layoutInflater.inflate
                                                   (R.layout.vampireimage, null);     
    this.addContentView(cameraViewControl, layoutParamsControl);
    
    btnCapture = (Button)findViewById(R.id.btnCapture);
    btnCapture.setOnClickListener(new OnClickListener() 
    {
      @Override
      public void onClick(View v) 
      {
// TODO Auto-generated method stub
camera.takePicture(cameraShutterCallback, 
                                       cameraPictureCallbackRaw,
                                       cameraPictureCallbackJpeg);
      }
    });
  }

  ShutterCallback cameraShutterCallback = new ShutterCallback() 
  {
    @Override
    public void onShutter() 
    {
      // TODO Auto-generated method stub
    }
  };

  PictureCallback cameraPictureCallbackRaw = new PictureCallback() 
  {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) 
    {
      // TODO Auto-generated method stub
    }
  };

  PictureCallback cameraPictureCallbackJpeg = new PictureCallback() 
  {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) 
    {
      // TODO Auto-generated method stub
      Bitmap cameraBitmap = BitmapFactory.decodeByteArray
                                                                  (data, 0, data.length);

      wid = cameraBitmap.getWidth();
      hgt = cameraBitmap.getHeight();

      Bitmap newImage = Bitmap.createBitmap
                                        (wid, hgt, Bitmap.Config.ARGB_8888);

      Canvas canvas = new Canvas(newImage);

      canvas.drawBitmap(cameraBitmap, 0f, 0f, null);

      Drawable drawable = getResources().getDrawable
                                                          (R.drawable.vmlogo1);
      drawable.setBounds(20, 20, 260, 160);
      drawable.draw(canvas);

      File storagePath = new File(Environment.
                    getExternalStorageDirectory() + "/Vampire Photos/"); 
      storagePath.mkdirs(); 

      File myImage = new File(storagePath,
                    Long.toString(System.currentTimeMillis()) + ".jpg");
            
      try
      {
        FileOutputStream out = new FileOutputStream(myImage);
        newImage.compress(Bitmap.CompressFormat.JPEG, 80, out);


        out.flush();
        out.close();
      }
      catch(FileNotFoundException e)
      {
Log.d("In Saving File", e + "");
      }
      catch(IOException e)
      {
        Log.d("In Saving File", e + "");
      }

      camera.startPreview();

      drawable = null;

      newImage.recycle();
      newImage = null;

      cameraBitmap.recycle();
      cameraBitmap = null;
    }
  };

  @Override
  public void surfaceChanged(SurfaceHolder holder, 
                                       int format, int width, int height) 
  {
    // TODO Auto-generated method stub

    if(previewing)
    {
      camera.stopPreview();
      previewing = false;
    }
    try 
    {
      Camera.Parameters parameters = camera.getParameters();
      parameters.setPreviewSize(360,420);
      parameters.setRotation(90);
      camera.setParameters(parameters);

      camera.setPreviewDisplay(cameraSurfaceHolder);
      camera.startPreview();
      previewing = true;
    } 
    catch (IOException e) 
    {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

  @Override
  public void surfaceCreated(SurfaceHolder holder) 
  {
    // TODO Auto-generated method stub
    try
    {
      camera = Camera.open();
    }
    catch(RuntimeException e)
    {
      Toast.makeText(getApplicationContext(), "Device camera 
                   is not working properly, please try after 
                   sometime.", Toast.LENGTH_LONG).show();
    }
  }

  @Override
  public void surfaceDestroyed(SurfaceHolder holder) 
  {
    // TODO Auto-generated method stub
    camera.stopPreview();
    camera.release();
    camera = null;
    previewing = false;
  }
}


Here is the layout file which I have used :


homescreen.xml



<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                     android:orientation="vertical"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent">
     
<SurfaceView android:id="@+id/cameraSurfaceView"  
                   android:layout_width="fill_parent" 
                   android:layout_height="fill_parent"/>     
    
</LinearLayout>


cambutton.xml



<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                     android:orientation="vertical"
                     android:layout_width="fill_parent"
                     android:layout_height="fill_parent"
                     android:gravity="right">


<Button android:id="@+id/btnCapture"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/camera"
            android:gravity="center_vertical"
            android:layout_margin="10px"/>


</LinearLayout>


vampireimage.xml



<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                     android:orientation="vertical"
                     android:layout_width="fill_parent"
                     android:layout_height="fill_parent"
                     android:gravity="bottom">     
  
<ImageView android:id="@+id/imgVampire"
                  android:src="@drawable/vmlogo"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:gravity="left"
                  android:layout_margin="10px"/>


</LinearLayout>


Thanks
akm
www.cdacians.com

No comments:

Post a Comment