我正在使用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
无法帮助您补偿失真。这定义了传感器的一个区域,以便读取以进行捕获,但结果不会直接进入屏幕,而是传递到输出流。
输出流使用此矩形产生输出,必要时裁剪到较小的区域以保持流的纵横比,然后缩放传感器输入以匹配输出的配置分辨率。
请参阅此答案,以获取以不同方式处理失真的示例。