2016-04-20 6 views
0

Bitte sagen Sie mir, wie Sie die Strechung des Bildes in meiner Kameravorschau lösen.Kamera Vorschau ist gestreckt und verzerrt

Kamera Vorschau Klasse

public class CameraPreview erweitert Surface implementiert SurfaceHolder.Callback { privaten SurfaceHolder mHolder; private Kamera mCamera;

Öffentliche Klasse CameraPreview erweitert SurfaceView implementiert SurfaceHolder.Callback { private SurfaceHolder mHolder; private Kamera mCamera;

public CameraPreview(Context context, Camera camera) { 
    super(context); 
    mCamera = camera; 
    mHolder = getHolder(); 
    mHolder.addCallback(this); 
    // deprecated setting, but required on Android versions prior to 3.0 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

public void surfaceCreated(SurfaceHolder holder) { 
    try { 
     // create the surface and start camera preview 
     if (mCamera == null) { 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 
     } 
    } catch (IOException e) { 
     Log.d(VIEW_LOG_TAG, 
       "Error setting camera preview: " + e.getMessage()); 
    } 
} 

public void refreshCamera(Camera camera) { 
    if (mHolder.getSurface() == null) { 
     // preview surface does not exist 
     return; 
    } 
    // stop preview before making changes 
    try { 
     mCamera.stopPreview(); 
    } catch (Exception e) { 
     // ignore: tried to stop a non-existent preview 
    } 
    // set preview size and make any resize, rotate or 
    // reformatting changes here 
    // start preview with new settings 
    setCamera(camera); 
    try { 
     mCamera.setPreviewDisplay(mHolder); 
     mCamera.startPreview(); 
    } catch (Exception e) { 
     Log.d(VIEW_LOG_TAG, 
       "Error starting camera preview: " + e.getMessage()); 
    } 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    // If your preview can change or rotate, take care of those events here. 
    // Make sure to stop the preview before resizing or reformatting it. 
    refreshCamera(mCamera); 
} 

public void setCamera(Camera camera) { 
    // method to set a camera instance 
    mCamera = camera; 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    // mCamera.release(); 

} 

}

+0

Beachten Sie die Verwendung von AspectFrameLayout in Grafika, z.B. "kontinuierliche Erfassung" (https://github.com/google/grafika/blob/master/src/com/android/grafika/ContinuousCaptureActivity.java). FWIW, während Ihr Bild gestreckt wird, wäre ich überrascht, dass es verzerrt wäre, da sowohl Quelle als auch Ziel Rechtecke sind. – fadden

Antwort

0

Vielleicht ist Ihr CameraView das Seitenverhältnis nicht mit dem Seitenverhältnis von Kameravorschaugröße entsprechen.
Sie sollten das Seitenverhältnis Ihres CameraView berechnen und dieses Seitenverhältnis verwenden, um die beste Größe für die Methode Camera.Parameters.setPreviewSize() zu finden. Versuchen Sie, diese

private Camera.Size getBestPreviewSize(Camera.Parameters parameters, int width, int height) { 
    Camera.Size result = null; 
    double ratio = width/height; 
    double w = 0, h = 0; 
    for (Camera.Size size : parameters.getSupportedPreviewSizes()) { 
     w = size.width; 
     h = size.height; 
     if (w/h == ratio) { 
      if (result != null) { 
       if (w > result.width) { 
        result = size; 
       } 
      } else { 
       result = size; 
      } 
     } 

    } 
    return (result); 
} 
+0

wo diese Methode aufrufen? und wie überprüft man die Größe meiner Vorschau? – champion

+0

Zuerst müssen Sie diese Methode vor der Vorschau aufrufen. Sie können nach 'Wie stelle ich meine Vorschaugröße für die Kamera' ein, um die Schritte zu sehen. Zweitens ist die Größe der Vorschau die Größe von SurfaceView, die Sie auf dem Bildschirm anzeigen. Schließlich ist Faddens Vorschlag ein anderer Weg. – sonngaytho