2012-06-22 1 views
14

In modalità verticale, le immagini appaiono allungate verticalmente e in modalità orizzontale appaiono allungate orizzontalmente.Visualizzazione superficie fotocamera Immagini Esteso

Anche se dopo l'acquisizione l'immagine viene visualizzata nella dimensione corretta.

Come risolvere questo problema?

risposta

-3

Se si sta parlando di anteprima, provare a impostare le dimensioni di SurfaceView come le dimensioni di anteprima della fotocamera. In questo modo l'anteprima non dovrebbe essere ridimensionata.

8

È necessario scegliere una dimensione di anteprima che corrisponda alle dimensioni dello schermo. Suggerirei di modificare l'impostazione della dimensione dell'anteprima in modo che corrisponda al numero SurfaceView anziché viceversa. Mentre i dati di anteprima sono perfetti, non sono distorti, appariranno distorti quando vengono lanciati su una superficie con proporzioni diverse.

Se si dispone di una visualizzazione a schermo intero, si dovrebbe trovare la fotocamera ha una dimensione di anteprima corrispondente a tale dimensione - almeno ce ne sarà uno con lo stesso rapporto di aspetto. Ad esempio se lo schermo è 640x480, le dimensioni dell'anteprima 320x240 non verranno visualizzate su una schermata intera SurfaceView.

+0

Per impostare le dimensioni anteprima Sto usando seguente codice, ma ancora superficie appare allungato: private Camera.Size getBestPreviewSize (int width, int altezza, \t \t \t Camera.Parameters parametri) { \t \t Camera.Size result = null; \t \t per (dimensione Camera.Size: parameters.getSupportedPreviewSizes()) { \t \t \t se (size.width <= larghezza && size.height <= altezza) { \t \t \t \t se (risultato == null) { \t \t \t \t \t risultato = dimensione; \t \t \t \t} else { \t \t \t \t \t int resultarea = result.width * result.height; \t \t \t \t \t int newArea = size.width * dimensioni.altezza; \t \t \t \t \t se (newArea> resultarea) { \t \t \t \t \t \t result = dimensioni; \t \t \t \t \t} \t \t \t \t} \t \t \t} \t \t} \t \t ritorno (risultato); \t} – Manjeet

+0

Perché lo stai facendo in questo modo? cerca prima una semplice corrispondenza esatta. Sembra che tu stia copiando codice molto vecchio da Barcode Scanner. –

3

Ho fissato questo con l'aggiunta di questo prima di chiamare camera.startPreview():

Camera.Parameters parameters = camera.getParameters(); 
parameters.setPreviewSize(yourSurfaceView.getWidth(), yourSurfaceView.getHeight()); 
camera.setParameters(parameters); 

Potrebbe aiutare qualcuno.

+11

In molti casi ciò genera un'eccezione di runtime (setParameters non riuscita) poiché la dimensione di surfaceView non corrisponde a nessuna dimensione di anteprima supportata. – marino

+0

È necessario impostare la dimensione dell'anteprima come previsto da getSupportedPreviewSize(), questo è in accordo con i documenti. Dice che non devi impostare alcun valore arbitrario su setPreviewSize(). –

4

Devi limitare le dimensioni dell'anteprima in base a (1) dimensioni di anteprima disponibili (2) la tua vista. Ecco la mia soluzione se ne hai ancora bisogno:

private class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 

    public CameraPreview(Context context, Camera camera) { 
     super(context); 
     mCamera = camera; 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     // deprecated setting, but required on Android versions prior to 3.0 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    private void startPreview() { 
     try { 
     /** 
     * Orientation should be adjusted, see http://stackoverflow.com/questions/20064793/how-to-fix-camera-orientation/26979987#26979987 
     */ 

      Camera.Parameters parameters = mCamera.getParameters(); 
      List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes(); 
      Camera.Size previewSize = null; 
      float closestRatio = Float.MAX_VALUE; 

      int targetPreviewWidth = isLandscape() ? getWidth() : getHeight(); 
      int targetPreviewHeight = isLandscape() ? getHeight() : getWidth(); 
      float targetRatio = targetPreviewWidth/(float) targetPreviewHeight; 

      Log.v(TAG, "target size: " + targetPreviewWidth + "/" + targetPreviewHeight + " ratio:" + targetRatio); 
      for (Camera.Size candidateSize : previewSizes) { 
       float whRatio = candidateSize.width/(float) candidateSize.height; 
       if (previewSize == null || Math.abs(targetRatio - whRatio) < Math.abs(targetRatio - closestRatio)) { 
        closestRatio = whRatio; 
        previewSize = candidateSize; 
       } 
      } 

      Log.v(TAG, "preview size: " + previewSize.width + "/" + previewSize.height); 
      parameters.setPreviewSize(previewSize.width, previewSize.height); 
      mCamera.setParameters(parameters); 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
      Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
     } 
    } 
} 
-1

La soluzione è semplice! Se usi surfaceview sotto actionbar questo forse è il problema. Io uso questa linea e posso risolvere, ma non testare utilizzando la barra delle azioni.

uso questo:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);