2011-12-05 19 views
8

Desidero utilizzare l'anteprima della fotocamera per il riconoscimento dell'immagine. Per i miei scopi , ho bisogno che la risoluzione di anteprima sia il più alta possibile (e, allo stesso tempo, visualizzi l'anteprima per l'utente).Come ottenere dati di anteprima della fotocamera Android 720p?

Ho creato una classe Anteprima, estendendo SurfaceView e impostato PreviewSize su 1280x720. Ho aggiunto un PreviewCallBack per ottenere il live 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() 
} 

mio array di byte b è 1.382.400 byte e la mia funzione CameraPreviewCallback.onPreviewFrame() riceve quei 1382400 Bytes - ma solo il primo 497.664 Byte contengono dati (corrispondenti a Risoluzione 768x432 (HTC Desire)).

Ho provato questo su diversi dispositivi, tutti con risoluzioni dello schermo di 800x480 (HTC Desire, LG Optimus 3D, Samsung Galaxy S2, scheda Samsung Galaxy , ...). L'unico dispositivo per cui funziona il mio codice è un HTC Desire HD.

Qualcuno sa come ricevere la risoluzione 720p completa come matrice Byte ? "Qualcosa" sembra ridurre la risoluzione di anteprima per adattarsi allo schermo dello smartphone.

saluti

Joern

+0

Sei sicuro che il tuo telefono supporti 720p? Logcat dice qualcosa (come "non può impostare la risoluzione")? – Lennart

+0

Sì, 720p è supportato su tutti i dispositivi come dimensione di anteprima. Logcat non dice nulla di speciale - sembra che "qualcosa" riduca silenziosamente la risoluzione di anteprima. –

+0

getPreviewSize() restituisce la dimensione corretta? – Lennart

risposta

8

Non è possibile utilizzare qualsiasi risoluzione casuale per un anteprima della fotocamera.

Alcuni dispositivi supportano solo determinate risoluzioni. È possibile interrogare questi tramite Camera.Parameters.getSupportedPreviewSizes() ¹. Se il tuo dispositivo non restituisce 1280x720 in questo elenco, non puoi usarlo. Seleziona una risoluzione supportata che si avvicini a quella desiderata.

¹ si dovrebbe fare in modo, in generale, prima di utilizzare qualsiasi risoluzione, 720p o no

+2

(Purtroppo) 1280x720p è nell'elenco di tutti i dispositivi elencati. Ho controllato SupportedPreviewSizes. –

2

Anche se questa è una vecchia questione, la risposta è la stessa: l'elenco dei formati di anteprima supportati per ogni dispositivo non è preciso. La dimensione di anteprima predefinita è, per quanto ne so, sempre valida. Altre dimensioni sembrano funzionare al massimo caso per caso - si può essere ragionevolmente sicuri che una dimensione di anteprima predefinita non sarà errata sullo schermo, ma questo è tutto. In particolare, il Byte Array non sarà scalabile per adattarsi a formati di immagine più grandi anche se sono "supportati", e solo alcune delle dimensioni di anteprima "supportate" saranno correttamente rese a risoluzione e senza distorsione verde/rosa.

L'unico modo affidabile per sapere che la risoluzione è corretta e i dati di onPreviewFrame() è buona è testarlo manualmente.

Problemi correlati