全屏幕相机预览,不会出现扭曲或拉伸。

7

我是一名有用的助手,可以为您进行翻译。以下是需要翻译的内容,涉及到IT技术方面。

我有一个cameraPreview类(见下文),它以全屏和横向模式启动...但图像被拉伸和扭曲了...是否有一种方法让预览保持全屏但不失真?

camLayer:

public class CamLayer extends SurfaceView implements SurfaceHolder.Callback {
       Camera camera;
       SurfaceHolder previewHolder;
       String camID;
       private static final String TAG = "Cam Preview";


       public CamLayer(Context context, String facing)
       {
               super(context);
               camID = facing;
               previewHolder = this.getHolder();
               previewHolder.addCallback(this);
               previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);


       }
       public void surfaceCreated(SurfaceHolder holder) {
           startCamera();
       }

       @Override
       public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
       {
               Parameters params = camera.getParameters();
                   //params.setPreviewSize(width, height);
                   //params.setPictureFormat(PixelFormat.JPEG);
                   camera.setParameters(params);
                   camera.startPreview();


       }

       public void surfaceDestroyed(SurfaceHolder arg0)
       {

            stopCamera();
       }



       public void onResume() {

           startCamera();

       }

       public void onPause() {

           stopCamera();
       }


       public void stopCamera(){
            System.out.println("stopCamera method");
            if (camera != null){
                camera.stopPreview();
                camera.setPreviewCallback(null);
                camera.release();
                camera = null;
                previewHolder.removeCallback(this);
                previewHolder = null;
            }
        }

       private void startCamera(){
           if(camID.equals("front")){
               camera=Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
           }else{
               camera=Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
           }
           try {
                   camera.setPreviewDisplay(previewHolder);

                }
                   catch (Throwable e){ Log.w("TAG,", "failed create surface !?!?"); }
        }

       public void draw(Canvas canvas) {
           super.draw(canvas);
           Paint p = new Paint(Color.RED);
           Log.d(TAG, "draw");
           canvas.drawText("PREVIEW", canvas.getWidth() / 2,
                canvas.getHeight() / 2, p);
        }
}

问题解决了吗? - Vishal Vyas
2个回答

1

你需要运行params.getSupportedPreviewSizes();

从中找到最适合你的视图的预览大小。

看看这个项目:https://github.com/commonsguy/cw-advandroid/blob/master/Camera/Picture/src/com/commonsware/android/picture/PictureDemo.java

  private Camera.Size getBestPreviewSize(int width, int height,
                                         Camera.Parameters parameters) {
    Camera.Size result=null;

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
      if (size.width <= width && size.height <= height) {
        if (result == null) {
          result=size;
        }
        else {
          int resultArea=result.width * result.height;
          int newArea=size.width * size.height;

          if (newArea > resultArea) {
            result=size;
          }
        }
      }
    }

    return(result);
  }

0
除了Lena Bru提到的找到一个好的预览尺寸之外,如果您选择的相机预览尺寸与CamLayer的尺寸没有完全匹配的纵横比,避免失真的唯一选择就是调整CamLayer的布局。
相机预览只是被拉伸以覆盖整个视图,无论纵横比如何,因此为了获得无畸变的视图,您必须配置View的布局以匹配所选的预览纵横比。请参阅Android开发者网站自定义组件文档,特别是关于onMeasure的部分。
您需要报告基于预览纵横比的宽度和高度,并且在配置相机预览大小以更新View大小时,您可能需要触发UI的重新布局。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接