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



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

我试过使用SurfaceView的框架大小,只是用负边界使视图比屏幕大(像这样(,但这会拉伸图像。现在我正在尝试使用SCALER_ROP_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扩展到比屏幕更大吗?

不幸的是,SCALER_CROP_REGION无法帮助您补偿失真。这定义了传感器的一个区域,以便读取以进行捕获,但结果不会直接进入屏幕,而是传递到输出流。

输出流使用此矩形产生输出,必要时裁剪到较小的区域以保持流的纵横比,然后缩放传感器输入以匹配输出的配置分辨率。

请参阅此答案,以获取以不同方式处理失真的示例。

最新更新