使用SCALER_CROP_REGION进行裁剪时,Camera2预览会拉伸

时间:2017-05-11 14:08:59

标签: android scale crop preview android-camera2

我想使用camera2 api在全屏中显示预览。我选择的相机尺寸为 4160x3120 (16:9),我的屏幕为 1080x1920 (9:16)。因此,如果我想要缩放预览,我必须裁剪相机输出:

Rect zoomCrop = new Rect(0, 0, 1755, 3120);
captureRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoomCrop);

裁剪预览的尺寸应为 1755x3120 ,其比例为9:16。预览仍然是拉伸的。

问题: 我正确使用SCALER_CROP_REGION吗?如果没有,我该如何使用呢?

提前致谢

2 个答案:

答案 0 :(得分:3)

我一直在遇到同样的问题,因为我想将相机预览流实现为 square TextureView。

使用SCALER_CROP_REGION似乎是解决纵横比不兼容的问题的显而易见的地方,但是我认为该操作实际上不会改变结果的纵横比,因此不会阻止拉伸/扭曲行为。 (the docs talk about this

通过实现与Camera2Basic示例项目中的转换类似的转换,我已经取得了进步-参见Camera2BasicFragment中的函数configureTransform)。

使用这种视图级别的缩放矩阵,您可以在不更改视图大小的情况下管理摄像机预览的缩放/裁剪。

答案 1 :(得分:2)

听起来你正在拍摄风景图像并以纵向视图显示 - 这意味着如果你想避免失真,你将在图像的上方和下方有“柱框”线。

如果您确实想要填充屏幕,并且没有扭曲或柱框线,那么您将不得不接受图像的一部分将不可见,因为它在观察区域的外部。

没有图表,SCALER_CROP_REGION很难理解 - 我在这里找到了Andoir源文档中的最佳解释:https://source.android.com/devices/camera/camera3_crop_reprocess

从中复制的一个图表有助于作为一个例子 - 突出显示这一点的原因是为了说明如何使用坐标。如果你看一下你的裁剪区域,当你从(0,0)开始时它将偏向左上方,我不确定你真正想要的是什么。

enter image description here