安卓相机2预览和捕获,宽高比为4:3,但宽度>高度



我正在尝试使用Camera2API实现自定义大小的相机视图(预览和捕获)。特别是4:3的比例,但横向预览(宽度>高度)。

到目前为止,我能够获得正确的TextureView大小,但预览是垂直挤压的,或者正确的预览,但TextureView的大小超出了所需的容器大小。

尝试使用以下代码设置SCALER_CROP_REGION,但没有效果。

val sensorRect = cameraCharacteristics
.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE)
?: return@run
val sensorWidth = sensorRect.width()
val sensorToViewRatio = sensorWidth / preview.width.toFloat()
val sensorBottom = (preview.height * sensorViewRatio).roundToInt() + sensorRect.top
previewRequestBuilder.set(
CaptureRequest.SCALER_CROP_REGION,
Rect(sensorRect.left, sensorRect.top, sensorRect.right, sensorBottom)
)

还尝试了textureView.setTransform(matrix)setRectToRectpostScale,但没有成功。这裁剪了预览曲面本身,但实际预览仍然受到挤压。

实现这种自定义预览和捕获大小的正确和推荐方法是什么?

谷歌CameraView库的增强版让我惊叹不已。

我正在开发的库CameraViewEx代码库可以在这里找到。

以下是可能与实现预期行为相关的类别。

  • CameraView容器
  • 纹理视图
  • Camera2的实施

SCALER_ROP_REGION不会更改输出的纵横比。主要的开发人员文档并没有尽可能清楚地说明,但这里有一些图表显示了裁剪是如何发生的。

图像传感器需要与设备的长边对齐,因此横向放置的设备将很容易显示横向预览。那么你是在问一个具有横向纵横比的纵向UI布局视图显示相机预览吗?

通常,如果不添加黑色条进行预览(在本例中,在左侧和右侧),或者不进行裁剪和缩放(删除很大比例的视场;对于4:3的纵横比,约为45%),就无法做到这一点。

后者应该可以通过TextureView的变换实现,但必须确保从已经在TextureView上设置的变换开始,或者必须考虑更多涉及传感器、设备和UI的相对方向的变换。

最新更新