How to save overlay with camera preview in android?

I can place the overlay on top of the live camcorder, but I also need to save the image captured by the camera with this overlay.

Here is the code for my MainActivity.class file:

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; } } } } 

And the code of 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; } } 
+4
source share

Source: https://habr.com/ru/post/1436312/


All Articles