2011-09-28 13 views
22

L'app che sto scrivendo richiede la funzionalità della fotocamera. Quindi, per imparare su come utilizzare la fotocamera, ho seguito questo script:Fotocamera Android allungata in modalità orizzontale

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html

ho messo l'attività nel mio manifesto, impostare l'orientamento dello schermo per esso su modalità orizzontale.

Il problema che sto riscontrando è, quando la fotocamera è tenuta di lato (quindi tengo il mio Galaxy Tab P1000 in posizione orizzontale) la vista è allungata.

Per essere più specifico sul mio script, ho utilizzato una copia esatta del codice creata da Google. Può essere trovato in Android-sdk \ samples \ android-8 \ ApiDemos \ src \ com \ example \ android \ apis \ graphics \

Il file stesso si chiama CameraPreview.

Non ho davvero idea del perché lo schermo sia così teso. Naturalmente, il formato è strano e non quadrato, ma comunque, quando si utilizza l'app fotocamera predefinita installata sul dispositivo, non si deforma affatto. Questa fotocamera deforma l'immagine quando la tengo lateralmente e sposta la fotocamera anche un po '.

enter image description here

enter image description here

Quello che ho fatto è stato: ho tenuto il mio galaxy tab per scattare una foto di un oggetto (computer portatile in questo caso) poi ha preso una foto con il telefono del mio Galaxy. Sul Galaxy ho aperto lo schermo della fotocamera nell'app che sto realizzando. Questo vale per entrambe le immagini. Uno che tengo di lato e uno che tengo in vista verticale. Le foto sono un po 'oscure ma puoi vedere che nell'immagine del paesaggio, la fotocamera è diventata largamente ampia.

+3

T_T Quindi sono l'unico al mondo ad avere questo problema? <: –

+0

Anche io sto riscontrando questo problema ... – Saty

+0

Questa domanda è una gemma nascosta!Ho avuto difficoltà a cercare questo. Avendo usato tutte le parole chiave in google. Questa domanda mi ha salvato la vita. –

risposta

21

Ho affrontato lo stesso problema ieri. Dopo aver cercato fonti "Camera" ho trovato un motivo per allungare l'anteprima della fotocamera.

Il motivo è: aspect ratio di SurfaceView (larghezza/altezza) DEVE essere uguale al rapporto di aspetto Camera.Size utilizzato nei parametri di anteprima. E se le proporzioni non sono le stesse, hai un'immagine allungata.

Quindi, la soluzione più veloce è impostare SurfaceView su dimensioni come 320px x 240px, la dimensione minima supportata da Parameters.getSupportedPreviewSizes().

Inoltre, è possibile consultare le origini dell'applicazione Camera standard, utilizza il layout personalizzato per il controllo della dimensione di SurfaceView (vedere Funzione PreviewFrameLayout.java, onMeasure()).

Usa

git clone https://android.googlesource.com/platform/packages/apps/Camera.git

per ottenere fonti fotocamera.

+1

+1 per descrivere il problema reale. Puoi trovare l'altezza e la larghezza di SurfaceView in surfaceChanged, quindi utilizzare getSupportedPreviewSizes nell'oggetto Parametri Camera per trovare la corrispondenza più simile e impostare SurfaceView sulla dimensione accettabile necessaria. –

+0

sto facendo così, ma non funziona. private Camera.Size getBestPreviewSize (int width, int height, parametri Camera.Parameters) { \t Camera.Size result = null; \t per (dimensione Camera.Size: parameters.getSupportedPreviewSizes()) { \t \t se (size.width <= larghezza && size.height <= altezza) { \t \t \t se (risultato == null) { \t \t \t \t risultato = dimensione; \t \t \t} \t \t \t else { \t \t \t \t int resultarea = result.width * result.height; \t \t \t \t int newArea = size.width * size.height; \t \t \t \t se (newArea> resultarea) { \t \t \t \t \t result = dimensioni; \t \t \t \t} \t \t \t} \t \t} \t} ritorno (risultato); } – gIrL

+1

Il codice cerca solo la dimensione di anteprima più grande che si adatta alla larghezza e all'altezza iniziali. Naturalmente hai problemi con lo schermo allungato, perché il più grande non significa "miglior rapporto d'aspetto". È necessario adattare la dimensione di visualizzazione dell'anteprima a quella "più grande", regolandone la larghezza o l'altezza in modo che quel rapporto = larghezza/altezza sia lo stesso per i valori iniziali (larghezza, altezza) e per i valori finali (risultato.arghezza, result.height) – Lord

7
public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

     try { 
      camera = Camera.open(); 

      camera.setDisplayOrientation(90); 
      camera.setPreviewDisplay(holder); 
      Camera.Parameters parameters = camera.getParameters(); 
      List<Size> sizes = parameters.getSupportedPictureSizes(); 
      parameters.setPictureSize(sizes.get(0).width, sizes.get(0).height); // mac dinh solution 0 
      parameters.set("orientation","portrait"); 
      //parameters.setPreviewSize(viewWidth, viewHeight); 
      List<Size> size = parameters.getSupportedPreviewSizes(); 
      parameters.setPreviewSize(size.get(0).width, size.get(0).height); 
      camera.setParameters(parameters); 
      camera.startPreview(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

è necessario solo getSupportedPreviewSizes() e salvarlo in un List:

List<Size> size = parameters.getSupportedPreviewSizes(); 
      parameters.setPreviewSize(size.get(0).width, size.get(0).height); 
      camera.setParameters(parameters); 



camera.startPreview(); 

Spero che questo ti aiuta.

Problemi correlati