我正在使用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
上,但会放大。例如:
cropRectangle
从0、48开始,尺寸为720 x 1184。我希望看到的是图像的顶部和底部略有裁切,但宽度没有变化。相反,我看到的是图像被放大,以至于-大概-我得到的视图的中间50%左右被缩放以填满整个屏幕。据我所知,它也垂直拉伸了一点?当我从此预览中拍摄照片时,它会显示正常大小的视图,并清楚显示预览的缩放比例。
我的作物在做错什么导致了此问题?回到前面将SurfaceView扩展到大于屏幕的方法更好吗?
答案 0 :(得分:1)
不幸的是,SCALER_CROP_REGION
无法帮助您补偿失真。这定义了要读取以进行捕获的传感器区域,但是结果并没有直接显示在屏幕上,而是传递到了输出流。
输出流使用此矩形来生成其输出,如有必要,可以裁剪到较小的区域以保持流的宽高比,然后缩放传感器输入以匹配输出的配置分辨率。
有关以不同方式处理失真的示例,请参见this answer。