2012-01-09 14 views
8

Sto scrivendo una piccola app per Android in cui un utente può inserire un'immagine nell'anteprima live della telecamera e scattare una foto di questo. L'app combina quindi le due immagini in modo appropriato: tutto funziona perfettamente.In che modo Android gestisce le differenze tra dimensioni/rapporto di anteprima e dimensioni effettive di SufaceView?

Capisco che è possibile ottenere/impostare il PreviewSize utilizzando Camera.getParameters(), presumo che questo è correlato alla dimensione del "camera feed" in tempo reale.

Tuttavia, la dimensione del mio SurfaceView in cui viene visualizzata l'anteprima della fotocamera è diversa dalle PreviewSize riportate (e utilizzate). Ad esempio, nell'emulatore il mio SurfaceView disponibile è 360x215, mentre PreviewSize è 320x240. Tuttavia, l'intero SurfaceView è riempito con l'anteprima.

Ma l'immagine generata alla fine è (anche?) 320x240. In che modo Android compensa queste differenze di dimensioni e proporzioni? L'immagine è troncata?

O sto semplicemente fraintendendo il tema di PreviewSize - questo è correlato alla dimensione delle immagini generate o è correlato alla "anteprima in tempo reale" proiettata su SurfaceView? Esistono esempi di fotocamere non banali che si occupano di questo?

Ho bisogno di sapere come avviene la trasformazione, eventualmente, copiare/ridimensionare correttamente l'immagine nella foto, quindi queste domande.

+0

Si consiglia di dare un'occhiata alla mia risposta a me stesso per una domanda simile: http://stackoverflow.com/a/18159351/994834 – goto10

risposta

1

Sto cercando di capirlo da solo. Ecco cosa ho scoperto finora ..

  • La vista superficie ha una superficie interna chiamato mSurface effettivamente impiegata come mangime telecamera e l'alimentazione encoder. Quindi questo buffer deve essere la dimensione effettiva alla quale si desidera effettuare la registrazione.
  • È possibile impostare la dimensione di questa mSurface ad essere indipendente dal SurfaceView utilizzando il metodo
  • Ora setFixedSize si potrebbe desiderare di eseguire una registrazione HD così le esigenze mSurface a 1280x760 risoluzione, ma si SurfaceView non può essere così grande (Supponendo che lo stiate eseguendo su un telefono con uno schermo WVGA). Quindi provi a impostare una risoluzione inferiore a 1280x760, che mantiene anche le stesse proporzioni.
  • Android ora esegue un ridimensionamento sul buffer HD per ottenere la risoluzione di anteprima, il ritaglio non è fatto, si tratta solo ridimensionata per le SurfaceView reoslutions
  • Quindi a questo punto sia il mSurface e previewSize che si imposta la fotocamera è la stessa risoluzione e quindi la registrazione video risultante sarà della stessa risoluzione.

Detto questo, sto ancora cercando di far funzionare il mio registratore VGA su Nexus S, funziona su un dispositivo LG Maha. :)

Problemi correlati