Android Camera2 以 4:3 纵横比预览和捕捉,但宽度 > 高度

Posted

技术标签:

【中文标题】Android Camera2 以 4:3 纵横比预览和捕捉,但宽度 > 高度【英文标题】:Android Camera2 preview and capture with 4:3 aspect ratio but width > height 【发布时间】:2019-06-19 13:36:58 【问题描述】:

我正在尝试使用 Camera2 api 实现自定义大小的相机视图(预览和捕获)。特别是 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,但没有运气。这裁剪了预览表面本身,但实际预览仍然被挤压。

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

我正在使用google's CameraView library 的增强版。

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

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

CameraView container TextureView Camera2 implementation

【问题讨论】:

【参考方案1】:

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

图像传感器需要与设备的长边对齐,因此横向放置的设备可以轻松显示横向预览。那么,您是在询问具有横向纵横比视图的纵向 UI 布局(显示相机预览)吗?

一般来说,如果不添加黑条进行预览(在本例中为左右两侧),或者裁剪和缩放(移除大部分视野;大约 45%对于 4:3 宽高比)。

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

【讨论】:

感谢您的回复。是的,我正在尝试在纵向布局中获得横向纵横比。 “图像传感器需要与设备的长边对齐”这解释了我目前得到的肖像输出。它在某处有详细描述吗?另外,“确保从已在 TextureView 上设置的变换开始”是什么意思?你是说captureSession.startRepeating(..)之前的意思吗? 当您将相机设备连接到 TextureView Surface 时,设备会在 TextureView 上设置一个变换(一旦图像流动,通过 TextureView.getTransform 可见)。如果您覆盖该变换,您将失去相机为您所做的一些方向调整,除非您从 getTransform() 提供的变换开始。设备的长边要求在 android CDD 中:source.android.com/compatibility/9/…。

以上是关于Android Camera2 以 4:3 纵横比预览和捕捉,但宽度 > 高度的主要内容,如果未能解决你的问题,请参考以下文章

Android Camera 2 预览尺寸和设备纵横比

具有正确纵横比的android textureview全屏预览

通过具有 16:9 传感器阵列的相机上的 android Camera2 API 捕获 4:3 相机图片

4:3 平板电脑上的 Android 相机预览纵横比

缩放图像以填充 ImageView 宽度并保持纵横比

html5视频android:全屏保持纵横比