2011-12-05 58 views
8

Quiero usar la vista previa de la cámara para el reconocimiento de imágenes. Para mis propósitos , necesito que la resolución de vista previa sea lo más alta posible (y, al mismo tiempo, mostrar la vista previa al usuario).¿Cómo obtener 720p Android Camera Preview Data?

Creé una clase de vista previa, extendiendo SurfaceView y estableciendo el PreviewSize en 1280x720. He añadido una PreviewCallBack para obtener el vivo Image:

camera = Camera.open(); 

parameters = camera.getParameters(); 
parameters.setPreviewSize(1280,720); 

camera.setParameters(parameters); 
byte[] b = new byte[camera.getParameters().getPreviewSize().width * 
    camera.getParameters().getPreviewSize().height * 
    ImageFormat.getBitsPerPixel(camera.getParameters().getPreviewFormat())/8]; 
camera.addCallbackBuffer(b); 
camera.setPreviewCallbackWithBuffer(new CameraPreviewCallback()); 

try { 
camera.setPreviewDisplay(this.getHolder()); 
camera.startPreview() 
} 

Mi Byte Array B es 1.382.400 bytes y mi función CameraPreviewCallback.onPreviewFrame() recibe esos 1382400 Bytes - pero sólo el primer byte contiene datos 497664 (coincidente una resolución 768x432 (HTC Desire)).

He probado esto en diferentes dispositivos, todo ello con resoluciones de pantalla de 800x480 (HTC Desire, LG Optimus 3D, Samsung Galaxy S2, Samsung Galaxy Tab , ...). El único dispositivo para el que trabaja mi Código es un HTC Desire HD.

¿Alguien sabe cómo recibir la resolución completa de 720p como una matriz Byte ? "Algo" parece reducir la resolución de vista previa para adaptarse a la pantalla del teléfono inteligente.

Saludos

Joern

+0

¿Está seguro de que su teléfono admite 720p? ¿Logcat dice algo (como "no se puede establecer la resolución")? – Lennart

+0

Sí, 720p es compatible con todos los dispositivos como tamaño de vista previa. Logcat no dice nada especial: parece que "algo" reduce la resolución de vista previa en silencio. –

+0

¿getPreviewSize() devuelve el tamaño correcto? – Lennart

Respuesta

8

Usted no puede utilizar cualquier resolución al azar para una vista previa de la cámara.

Algunos dispositivos solo admiten ciertas resoluciones. Puede consultarlos a través del Camera.Parameters.getSupportedPreviewSizes() ¹. Si su dispositivo no devuelve 1280x720 en esta lista, no puede usarlo. Seleccione una resolución compatible que se acerque a la deseada en su lugar.

¹ debe hacerlo, en general, antes de utilizar cualquier resolución, 720p o no

+2

(Desafortunadamente) 1280x720p está en la lista de todos los dispositivos enumerados. Verifiqué los tamaños de la vista previa admitida. –

2

Aunque esta es una vieja pregunta, la respuesta es la misma: la lista de tamaños de vista previa admitidos para cada dispositivo no es exacta. El tamaño de vista previa predeterminado es, a mi leal saber y entender, siempre válido. Otros tamaños parecen funcionar a lo sumo caso por caso: puede estar razonablemente seguro de que un tamaño de vista previa predeterminado no se verá incorrecto en la pantalla, pero eso es todo. En particular, ese Byte Array no se escalará para acomodar formatos de imagen más grandes, incluso si son "compatibles", y solo algunos de los tamaños de vista previa "compatibles" se representarán correctamente en resolución y sin distorsión verde/rosa.

La única manera confiable de saber que la resolución es correcta y que los datos de onPreviewFrame() son buenos es probarlos manualmente.