如何在Android中保存与相机预览的叠加?

时间:2012-09-26 07:41:23

标签: java android overlay

我可以在实时相机上放置叠加,但我还需要保存相机拍摄的图像。

以下是我的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;
            }
        }
    }
}

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

0 个答案:

没有答案