开发者

adding image to the captured image in android

开发者 https://www.devze.com 2023-03-31 22:59 出处:网络
I am capturing an image using the following code public class PictureDemo extends Activity { private SurfaceView preview=null;

I am capturing an image using the following code

  public class PictureDemo extends Activity {
  private SurfaceView preview=null;
  private SurfaceHolder previewHolder=null;
  private Camera camera=null;
  private boolean inPreview=false;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    save=(Button)findViewById(R.id.save);
    save.setOnClickListener(this);
    image=(ImageView)findViewById(R.id.image);
    image.setImageResource(R.drawable.sofa);
    preview=(SurfaceView)findViewById(R.id.preview);
    previewHolder=preview.getHolder();
    previewHolder.addCallback(surfaceCallback);
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  }

  @Override
  public void onResume() {
  super.onResume();
  camera=CameraFinder.INSTANCE.open();
  }

  @Override
  public void onPause() {
    if (inPreview) {
    camera.stopPreview();
    }

    camera.release();
    camera=null;
    inPreview=false;

    super.onPause();
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    new MenuInflater(this).inflate(R.menu.options, menu);

    return(super.onCreateOptionsMenu(menu));
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId()==R.id.camera) {
      if (inPreview) {
        camera.takePicture(null, null, photoCallback);
        inPreview=false;
      }

      return(true);
    }

    return(super.onOptionsItemSelected(item));
  }

  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode==KeyEvent.KEYCODE_CAMERA ||
        keyCode==KeyEvent.KEYCODE_SEARCH) {

      return(true);
    }

    return(super.onKeyDown(keyCode, event));
  }

  private Camera.Size getBestPreviewSize(int width, int height,
                                         Camera.Parameters parameters) {
    Camera.Size result=null;

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
      if (size.width<=width && size.height<=height) {
        if (result==null) {
          result=size;
        }
        else {
          int resultArea=result.width*result.height;
          int newArea=size.width*size.height;

          if (newArea>resultArea) {
            result=size;
          }
        }
      }
    }

    return(result);
  }

  SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() {
    public void surfaceCreated(SurfaceHolder holder) {
      try {
        camera.setPreviewDisplay(previewHolder);
      }
      catch (Throwable t) {
        Log.e("PictureDemo-surfaceCallback",
              "Exception开发者_StackOverflow社区 in setPreviewDisplay()", t);
        Toast
          .makeText(PictureDemo.this, t.getMessage(), Toast.LENGTH_LONG)
          .show();
      }
    }

    public void surfaceChanged(SurfaceHolder holder,
                               int format, int width,
                               int height) {
      Camera.Parameters parameters=camera.getParameters();
      Camera.Size size=getBestPreviewSize(width, height,
                                          parameters);

      if (size!=null) {
        parameters.setPreviewSize(size.width, size.height);
        parameters.setPictureFormat(PixelFormat.JPEG);

        camera.setParameters(parameters);
        camera.startPreview();
        inPreview=true;
      }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
      // no-op
    }
  };

  Camera.PictureCallback photoCallback=new Camera.PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
      new SavePhotoTask().execute(data);
      camera.startPreview();
      inPreview=true;
    }
  };

  class SavePhotoTask extends AsyncTask<byte[], String, String> {
    @Override
    protected String doInBackground(byte[]... jpeg) {
      File photo=new File(Environment.getExternalStorageDirectory(),
                          "photo.jpg");

      if (photo.exists()) {
        photo.delete();
      }

      try {
        FileOutputStream fos=new FileOutputStream(photo.getPath());

        fos.write(jpeg[0]);
        fos.close();
      }
      catch (java.io.IOException e) {
        Log.e("PictureDemo", "Exception in photoCallback", e);
      }

      return(null);
    }
  }
}

and the xml file is

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

  <android.view.SurfaceView
  android:id="@+id/surface"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  />

  <ImageView
  android:id="@+id/image"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:scaleType="matrix"
  android:layout_centerInParent="true"
  />

  <Button
  android:id="@+id/save"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="save"
  android:layout_alignParentRight="true"
  />

</FrameLayout>

I can capture an image with this code but i need to add the image which was given to the ImageView to the captured image.

How to do that.

Thanks in advance.


Declare a Bitmap in your class

public class PictureDemo extends Activity {
  Bitmap bitmap;
  ...

I think you can get the image you just took with this:

public void onPictureTaken(byte[] data, Camera camera) {
  new SavePhotoTask().execute(data);
  camera.startPreview();
  inPreview=true;
  bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
}

And then set the bitmap to your ImageView like this:

image.setImageBitmap(bitmap);


Trying doing something like this:

Bitmap bitmap = new Bitmap(define the size and other params you like).
Canvas canvas = new Canvas();
canvas.drawBitmap(your captured image);
canvas.drawBitmap(the overlay image);

// Now the bitmap will include both captured imaged and overlayed image

You can look in here and here


You can do mFrameLayout.getDrawingCache() to get a bitmap of the whole layout. The drawing cache should be enabled. I dont know its default state.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号