Cómo guardar la superposición con vista previa de la cámara en android?

Puedo colocar una superposición sobre una alimentación viva de la cámara, pero también necesito ahorrar la imagen capturada por la cámara con esa superposición.

Aquí está el código de mi archivo MainActivity.class:

public class MainActivity extends Activity { private Button takePhoto, pickPhoto; private FrameLayout preview; private CameraSurfaceView cameraSurfaceView; private static final int SELECT_PICTURE_ACTIVITY_RESULT_CODE = 1; private static final int CAMERA_PIC_REQUEST = 2; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); takePhoto = (Button) findViewById(R.id.btn_takephoto); pickPhoto = (Button) findViewById(R.id.btn_pickPhoto); preview = (FrameLayout) findViewById(R.id.frameLayout1); takePhoto.setOnClickListener(clickListener); pickPhoto.setOnClickListener(clickListener); cameraSurfaceView = new CameraSurfaceView(MainActivity.this); preview.addView(cameraSurfaceView); } View.OnClickListener clickListener = new View.OnClickListener() { @Override public void onClick(View v) { if (v.equals(takePhoto)) { Camera camera = cameraSurfaceView.getCamera(); camera.takePicture(null, null, new HandlePictureStorage()); } else if (v.equals(pickPhoto)) { Intent photoPickerIntent = new Intent(); photoPickerIntent.setType("image/*"); // to pick only images photoPickerIntent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(photoPickerIntent, SELECT_PICTURE_ACTIVITY_RESULT_CODE); } } }; private class HandlePictureStorage implements PictureCallback { @Override public void onPictureTaken(byte[] picture, Camera camera) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss"); String date = dateFormat.format(new Date()); String photoFile = "CameraTest" + date + ".jpg"; String filename = Environment.getExternalStorageDirectory() + File.separator + photoFile; File pictureFile = new File(filename); try { FileOutputStream fos = new FileOutputStream(pictureFile); fos.write(picture); fos.close(); Toast.makeText(getApplicationContext(), "New Image saved:" + photoFile, Toast.LENGTH_LONG) .show(); } catch (Exception error) { Log.d("Error", "File" + filename + "not saved: " + error.getMessage()); Toast.makeText(getApplicationContext(), "Image could not be saved.", Toast.LENGTH_LONG).show(); } Intent newInt = new Intent(MainActivity.this, AddImageOverlay.class); newInt.putExtra(Constant.BitmatpByteArray, filename); startActivity(newInt); } } public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { switch (requestCode) { case SELECT_PICTURE_ACTIVITY_RESULT_CODE: Uri selectedImageUri = data.getData(); try { Bitmap bitmap = MediaStore.Images.Media.getBitmap( this.getContentResolver(), selectedImageUri); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } Toast.makeText(getApplicationContext(), "Photo Picked", Toast.LENGTH_SHORT).show(); // deal with it break; default: // deal with it break; } } } } 

Y el código de CameraSurfaceView.java:

 public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder holder; private Camera camera; public CameraSurfaceView(Context context) { super(context); // Initiate the Surface Holder properly this.holder = this.getHolder(); this.holder.addCallback(this); this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Override public void surfaceChanged(SurfaceHolder h, int format, int width, int height) { // Now that the size is known, set up the camera parameters and begin // the preview. Camera.Parameters parameters = camera.getParameters(); parameters.setPreviewSize(width, height); camera.setParameters(parameters); camera.startPreview(); h.getSurface().setLayer(R.drawable.ic_launcher); } @Override public void surfaceCreated(SurfaceHolder holder) { try { // Open the Camera in preview mode this.camera = Camera.open(); this.camera.setPreviewDisplay(this.holder); } catch (IOException ioe) { ioe.printStackTrace(System.out); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { // Surface will be destroyed when replaced with a new screen // Always make sure to release the Camera instance camera.stopPreview(); camera.release(); camera = null; } public Camera getCamera() { return this.camera; } } 

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.