Superposition d'images sur la prévisualisation de la Caméra SurfaceView et comment les sauver?

J'ai une SurfaceView qui est utilisé pour dessiner des images, et je tiens à les superposer sur un fil en direct de la caméra du téléphone. J'ai lu Superposition d'images sur la prévisualisation de la caméra surfaceview
et comment dessiner une superposition sur une surfaceview utilisé par l'appareil photo sur android

    public class TestCameraOverlayActivity extends Activity { 
Bitmap bitmap;
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
requestWindowFeature(Window.FEATURE_NO_TITLE); 
Preview mPreview = new Preview(this); 
DrawOnTop mDraw = new DrawOnTop(this); 
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
setContentView(mPreview); 
addContentView(mDraw, new LayoutParams (LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT)); 
} 
class DrawOnTop extends View { 
public DrawOnTop(Context context) { 
super(context); 
} 
@Override 
protected void onDraw(Canvas canvas) { 
Paint paint = new Paint(); 
paint.setStyle(Paint.Style.STROKE); 
paint.setColor(Color.BLACK); 
canvas.drawText("Test Text", 10, 10, paint); 
canvas.drawBitmap(bitmap, 0, 0, null);
super.onDraw(canvas); 
} 
} 
class Preview extends SurfaceView implements SurfaceHolder.Callback { 
SurfaceHolder mHolder; 
Camera mCamera; 
Preview(Context context) { 
super(context); 
//Install a SurfaceHolder.Callback so we get notified when the 
//underlying surface is created and destroyed. 
mHolder = getHolder(); 
mHolder.addCallback(this); 
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 
public void surfaceCreated(SurfaceHolder holder) { 
//The Surface has been created, acquire the camera and tell it where 
//to draw. 
mCamera = Camera.open(); 
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
} 
} 
public void surfaceDestroyed(SurfaceHolder holder) { 
//Surface will be destroyed when we return, so stop the preview. 
//Because the CameraDevice object is not a shared resource, it's very 
//important to release it when the activity is paused. 
mCamera.stopPreview(); 
mCamera = null; 
} 
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
//Now that the size is known, set up the camera parameters and begin 
//the preview. 
Camera.Parameters parameters = mCamera.getParameters(); 
parameters.setPreviewSize(w, h); 
mCamera.setParameters(parameters); 
mCamera.startPreview(); 
} 
} 
}

si vous l'exécutez, vous pouvez voir sur l'image de prévisualisation SurfaceView, mais ma question est comment faire pour l'enregistrer en format jpeg sur la carte sd. Pouvez-vous donner quelques conseils, si j'ai besoin de conversion de Format pour que je puisse les enregistrer en même temps. Ma solution partielle pour enregistrer l'image seulement

/** Handles data for jpeg picture */
PictureCallback jpegCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
FileOutputStream outStream = null;
try {
//write to local sandbox file system
//outStream = CameraDemo.this.openFileOutput(String.format("%d.jpg", 
System.currentTimeMillis()), 0); 
//Or write to sdcard
outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", 
System.currentTimeMillis()));   
outStream.write(data);
outStream.close();
Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
Log.d(TAG, "onPictureTaken - jpeg");
}
};

OriginalL'auteur pengwang | 2011-07-26