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)
与setRectToRect
和postScale
,但没有运气。这裁剪了预览表面本身,但实际预览仍然被挤压。
实现这种自定义预览和捕获大小的正确和推荐方法是什么?
我正在使用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 textureview全屏预览