2012-06-30 14 views
5

Utilizzo un DroidX per sviluppare un'app che utilizza l'immagine di anteprima della fotocamera. Il codice che sto usando si trova in numerosi posti sul web, ma ho notato che il metodo comune "getBestPreviewSize (width, height, camera.parameters)" restituisce una dimensione così piccola che il metodo decodeYUV420SP standard fallisce con l'eccezione del puntatore nullo.GetSupportedPreviewSize restituisce larghezza e altezza inversa

Alcuni debug rivela le supportedPreviewSizes per le mie DroidX sono:

  • 144H x 176w
  • 240h x 320W
  • 288h x 352W
  • 480H x 640W
  • 480H x 720W
  • 448h x 800w
  • 720h x 1280w

Si noti che i valori di altezza e larghezza offrono una prospettiva orizzontale. Questo non cambia con l'orientamento della fotocamera. La larghezza e l'altezza della superficie passata a getBestSupportedPreviewSizes è 480w x 778h.

Quando si passano i parametri camera.a getBestSupportedPreviewSizes() restituisce una dimensione 288 x 352. Ecco il codice chiamante - Mi scuso se il formato è spento ma ecco va:

 if (!cameraConfigured) { 
     Camera.Parameters parameters=camera.getParameters(); 
     Camera.Size size=getBestPreviewSize(pwidth, pheight, parameters); 
     if (size!=null) { 
      parameters.setPreviewSize(size.width, size.height); 
      camera.setParameters(parameters); 
      cameraConfigured=true; 
     } 
    } 

pwidth e pheight sono da altezza e larghezza parametri surfaceChanged di callback. Ho provato camera.setDisplayOrientation (90); in onResume(). Ho anche messo l'orientamento ("Portrait") nel manifest - nessuna delle 4 combinazioni di questi tentativi sembra modificare questo comportamento.

I miei pensieri sono semplicemente invertirli, ma è sbagliato su così tanti livelli. Dato che questo codice liberamente disponibile sembra essersi dimostrato in tanti altri esempi, ovviamente mi sto avvicinando male. Qualcuno può fornire qualche intuizione a questo comportamento?

Grazie in anticipo.

risposta

3

Il modo corretto di pensare alla fotocamera è in modalità orizzontale, questo significa che quando ci si pensa in modalità verticale, la larghezza e l'altezza si sentono "capovolte".

La funzione getBestPreviewSize(w, h, p) è semplicemente un involucro intorno alla funzione di getSupportedPreviewSizes()Camera.Parameters, così la larghezza e l'altezza passava non cambierà il risultato della funzione bestPreviewSize.

+0

Grazie Daniel. Sono un po 'confuso però. A quanto ho capito, passiamo la dimensione della superficie a getBestPreviewSizes() e restituisce la larghezza e l'altezza migliori per impostare l'anteprima con. Quindi se la larghezza è inferiore all'altezza (come in modalità verticale), la larghezza restituita sarà inferiore all'altezza della videocamera o l'altezza restituita sarà inferiore alla larghezza della videocamera. Quindi non capisco come non influisce sul risultato della funzione getBestPreviewSize. Cosa mi manca nel mio modo di pensare? – bob

+0

La maggior parte dei fns getBestPreviewSizes() che ho visto online usano solo la larghezza e l'altezza per trovare una dimensione di anteprima che abbia un buon rapporto tra proporzioni. Le proporzioni sono le stesse indipendentemente dal fatto che l'altezza e la larghezza siano invertite o meno. –

+0

ha risposto alla tua domanda? –

Problemi correlati