2011-08-29 108 views
1

將圖片添加到拍攝的圖像,我用下面的代碼在android系統

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

和XML文件來捕獲的圖像

<?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> 

我可以捕捉圖像與此代碼,但我需要將ImageView提供的圖像添加到捕獲的圖像。

如何做到這一點。

在此先感謝。

回答

0

試圖做這樣的事情:

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 

你可以看看在herehere

0

您可以通過mFrameLayout.getDrawingCache()來獲取整個佈局的位圖。應該啓用圖形緩存。我不知道它的默認狀態。

1

聲明一個位圖類

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

我認爲你可以像你剛纔拿着這個:

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

然後像下面這樣將位圖設置爲ImageView:

image.setImageBitmap(bitmap);