如何使用Camera2使用裁剪的相机预览填充非标准尺寸的SurfaceView?

时间:2018-11-13 21:28:52

标签: android android-camera2

我正在使用SurfaceView通过Camera2 api显示来自相机的提要-它可以工作,但是无论我做什么,图像似乎都被拉伸或放大到了非常明显的程度。

我尝试使用SurfaceView框架大小,只是使视图大于具有负边界(like this)的屏幕,但这是在拉伸图像。现在,我尝试使用SCALER_CROP_REGION,但是当实际的SurfaceView比图像分辨率小大约90像素时,似乎将比例放大为2:1。我的代码中用于配置事物的部分基本上是这样的,除了真正的代码更多的是分散的,经过实验的残骸:

    int width = mTextureView.getWidth();
    int height = mTextureView.getHeight();
    CameraCharacteristics characteristics
                    = manager.getCameraCharacteristics(cameraId);
    StreamConfigurationMap map = characteristics.get(
                    CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
    Size mCameraSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class));
    int xOffset = Math.floor((mCameraSize.x - width) / 2);
    int yOffset = Math.floor((mCameraSize.y - height) / 2);
    Rect cropRectangle = new Rect(xOffset, yOffset, width, height);
    mCaptureRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, cropRectangle );

重要的是,它可以将图像显示在SurfaceView上,但会放大。例如:

  • 在纵向模式下,手机最适合的摄像头尺寸为720 x 1280。
  • SurfaceView的尺寸为720 x 1184。
  • cropRectangle从0、48开始,尺寸为720 x 1184。

我希望看到的是图像的顶部和底部略有裁切,但宽度没有变化。相反,我看到的是图像被放大,以至于-大概-我得到的视图的中间50%左右被缩放以填满整个屏幕。据我所知,它也垂直拉伸了一点?当我从此预览中拍摄照片时,它会显示正常大小的视图,并清楚显示预览的缩放比例。

我的作物在做错什么导致了此问题?回到前面将SurfaceView扩展到大于屏幕的方法更好吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,SCALER_CROP_REGION无法帮助您补偿失真。这定义了要读取以进行捕获的传感器区域,但是结果并没有直接显示在屏幕上,而是传递到了输出流。

  

输出流使用此矩形来生成其输出,如有必要,可以裁剪到较小的区域以保持流的宽高比,然后缩放传感器输入以匹配输出的配置分辨率。

有关以不同方式处理失真的示例,请参见this answer