2016-04-20 14 views
0

カメラのプレビューで画像の歪みを解決する方法を教えてください。カメラのプレビューが歪んだり歪んだ

カメラプレビュークラス

パブリッククラスCameraPreviewはSurfaceViewがSurfaceHolder.Callback { プライベートSurfaceHolder mHolderを実装して拡張します。 プライベートカメラmCamera;

public class CameraPreview extends SurfaceViewの実装 SurfaceHolder.Callback { private SurfaceHolder mHolder; プライベートカメラ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

注GrafikaでAspectFrameLayoutの使用を試し「継続的キャプチャ」(https://github.com/google/grafika/blob/master/src/com/android/grafika/ContinuousCaptureActivity.java)。 FWIWは、あなたのイメージが伸びている間に、ソースとデスティネーションの両方が長方形であるので、歪んでいて驚いています。 – fadden

答えて

0

たぶん、あなたCameraViewのアスペクト比はカメラのプレビューサイズの縦横比と一致していません。
カメラビューのアスペクト比を計算し、このアスペクト比を使用してCamera.Parameters.setPreviewSize()メソッドの最適サイズを見つける必要があります。 例えばこの

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

このメソッドをどこで呼び出すのですか?プレビューのサイズを確認する方法は? – champion

+0

まず、プレビューを開始する前にこのメソッドを呼び出す必要があります。手順を見るために「カメラのプレビューサイズを設定する方法」を検索することができます。次に、プレビューのサイズは、画面に表示するSurfaceViewのサイズです。最後に、ファドデンの提案は別の方法です。 – sonngaytho

関連する問題