2014-08-29 12 views
5

Sto realizzando un'app per telecamere piuttosto specializzata per un dispositivo che viene sempre mantenuto in posizione orizzontale. Parte delle specifiche è che deve essere in grado di visualizzare in anteprima e scattare foto con orientamento verticale - vedere la configurazione 'A' di seguito. enter image description hereCome scattare una foto di ritratto quando il dispositivo è in orizzontale

(Ora prima che chiunque vota per chiudere questo problema suggerendo questo è una ripetizione di this other SO question, vorrei sottolineare che l'altra questione meramente rivolta se fosse possibile o no - a cui la risposta dichiarato è di sì. questa domanda, è di circa come si può fare.)

ho già istituito un TextureView per l'anteprima e la chiamata camera.setPreviewTexture(), in modo da vedere l'immagine della telecamera sullo schermo. Ho anche il codice attivo e funzionante che fa la versione orizzontale di quello che ho bisogno, vedi sotto la configurazione 'B'.

enter image description here Per impostare i parametri della fotocamera, prima di tutto leggo le impostazioni della fotocamera utilizzando getParameters(), quindi modifica solo quelle che desidero modificare. Quindi, nel caso di configurazione 'B', è solo una questione di eseguire il seguente codice:

camera_parameters = camera.getParameters(); 
camera_parameters.setPreviewSize(640,480); 
camera_parameters.setPictureSize(640,480); 
camera.setParameters(camera_parameters); 

(EDIT: ho già controllato che 640x480 era disponibile per entrambe le anteprime delle immagini e dimensioni). L'app funziona quindi esattamente come mi aspetterei.

Il problema si presenta quando si tenta di ottenere il funzionamento della configurazione "A". Questa volta, ho impostato la vista tessitura di essere più largo che alto, ed eseguire il seguente codice:

camera_parameters = camera.getParameters(); 
camera_parameters.set("orientation", "portrait"); 
camera_parameters.setPreviewSize(640,480); 
camera_parameters.setPictureSize(640,480); 
camera.setParameters(camera_parameters); 

Purtroppo questo non abbastanza fare il lavoro. Quello che finisco con l'esecuzione dell'app è più simile a questo: enter image description here Come puoi vedere l'immagine visualizzata in questa anteprima è essenzialmente un'immagine che è più larga di quanto sia alta, che è stata deformata in un rettangolo che è più alto di è largo Il file immagine jpeg salvato risultante è anche più largo di quanto sia alto.

ho pensato che forse avevo bisogno di cambiare il codice di seguito:

camera_parameters = camera.getParameters(); 
camera_parameters.set("orientation", "portrait"); 
camera_parameters.setPreviewSize(480,640); 
camera_parameters.setPictureSize(480,640); 
camera.setParameters(camera_parameters); 

Ma questo provoca un'eccezione "setParameters non riuscita".

Quindi la mia domanda è: quali parametri devo impostare su quali valori, tra camera.getParameters(); e setParameters(camera_parameters);?

+0

+1 perché la tua domanda ha appena risposto a una domanda che avevo da un po 'su come impostare le dimensioni di una foto. – Darrell

+0

Non è necessario che nessun dispositivo supporti 480x640/640x480 per anteprime o immagini. Si prega di utilizzare i metodi appropriati su 'Camera.Parameters' per scoprire cosa è disponibile. Allo stesso modo, non è richiesto a nessun dispositivo di rispettare il set ("orientamento", "ritratto") o qualsiasi altra combinazione di stringhe. Per visualizzare l'anteprima in verticale da un dispositivo in orizzontale, ruoterei il 'TextureView' di 90 gradi. Dubito che sia possibile fotografare in modo affidabile le foto di ritratti mentre si tiene in orizzontale. – CommonsWare

+0

FYI, ho già controllato, e stampato la lista delle dimensioni disponibili per l'anteprima e le immagini e 640.480 era disponibile (modifico OP). – Mick

risposta

0

lavoro molto con la macchina fotografica e l'immagine per realizzare un'applicazione simile a "face in hole" In questo caso il problema è che si tenta di impostare la dimensione con valore assoluto.

camera_parameters.setPreviewSize(480,640); 
camera_parameters.setPictureSize(480,640); 

Questo può generare un'eccezione sul telefono/emulatore e in un altro può funzionare bene. Il problema è che devi leggere le dimensioni consentite (relative alla fotocamera) e creare un algoritmo per scegliere tra di esse. Le funzioni sono:

  1. Camera.Parameters.getSupportedPictureSizes()
  2. Camera.Parameters.getSupportedPreviewSizes()

Qui trovi un esempio molto semplice:

mCamera = Camera.open(); 
Camera.Parameters params = mCamera.getParameters(); 
List<Size> sizes = params.getSupportedPictureSizes(); 
// See which sizes the camera supports and choose one of those 
mSize = sizes.get(0); 
params.setPictureSize(mSize.width, mSize.height); 
mCamera.setParameters(params); 

Con questi suggerimenti si possono trovare la soluzione che meglio si adatta al vostro aspettativa.

+1

Ho già fatto esattamente questo (vedi la "modifica" nella domanda originale). Ciò ha confermato che 640x480 era disponibile sia per l'anteprima che per l'immagine. Quello che ho notato è che non * * non era un'opzione per le dimensioni supportate in cui l'altezza era maggiore della larghezza. Avevo appena dato per scontato che questo fosse soddisfatto dal set ("orientation", "portrait"); ... forse no! Forse è impossibile? – Mick

+1

Certo, penso che la tua ipotesi sia corretta. –

Problemi correlati