2010-07-31 14 views
7

Estoy escribiendo una aplicación para capturar los marcos de vista previa de la cámara y convertirlo a mapa de bits en Android. Aquí está mi código:Cómo capturar marcos de imágenes de vista previa de la aplicación de cámara en la programación de Android?

Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() 
    { 
      public void onPreviewFrame(byte[] data, Camera camera) 
      { 
        try 
        { 
          BitmapFactory.Options opts = new BitmapFactory.Options(); 
          Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);//,opts); 
        } 
        catch(Exception e) 
        { 

        } 
      } 

    }; 

    mCamera = Camera.open(); 
    mCamera.setPreviewCallback(previewCallback); 

Después de empezar vista previa, la devolución de llamada fue llamado con los datos, pero el mapa de bits es nula.

¿Qué hice mal al convertir la matriz de bytes a BitMap?

+0

La misma pregunta como http://stackoverflow.com/questions/3338235/bitmapfactory-decodebytearray-is-returning-null (ATOW sin respuesta) – OJW

+0

duplicado Posible de [Cómo obtener marcos de la imagen de video en Android] (http://stackoverflow.com/questions/1893072/getting-frames-from-video-image-in-android) – Tim

Respuesta

1

¿Ha intentado decodificar los datos del cuadro de vista previa a RGB antes de usar BitmapFactory? El formato predeterminado es YUV que no estoy seguro es compatible con BitmapFactory. método de decodificación de Dave Manpearl se puede encontrar aquí:

Getting frames from Video Image in Android

Avísame si funciona.

Saludos,

Paul

16

En la función onPreviewFrame(), usted debe comprobar el formato de imagen en primer lugar.
Este es el ejemplo de NV21.

public void onPreviewFrame(byte[] data, Camera camera) 
{ 
    Parameters parameters = camera.getParameters(); 
    imageFormat = parameters.getPreviewFormat(); 
    if (imageFormat == ImageFormat.NV21) 
    { 
     Rect rect = new Rect(0, 0, PreviewSizeWidth, PreviewSizeHeight); 
     YuvImage img = new YuvImage(data, ImageFormat.NV21, PreviewSizeWidth, PreviewSizeHeight, null); 
     OutputStream outStream = null; 
     File file = new File(NowPictureFileName); 
     try 
     { 
      outStream = new FileOutputStream(file); 
      img.compressToJpeg(rect, 100, outStream); 
      outStream.flush(); 
      outStream.close(); 
     } 
     catch (FileNotFoundException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

Otra forma de tomar la foto, compruebe este artículo how to use camera in android

Cuestiones relacionadas