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. Come 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'.
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: 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);
?
+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
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
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