Android Camera2 预览和捕获 4 :3 aspect ratio but width > height

标签 android kotlin android-camera android-camera2

我正在尝试使用 Camera2 api 实现自定义大小的相机 View (预览和捕获)。特别是 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 .

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

最佳答案

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

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

一般来说,如果不添加黑条进行预览(在本例中为左侧和右侧),或者裁剪和缩放(移除大部分视野;大约 45%),就无法做到这一点4:3 纵横比)。

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

关于Android Camera2 预览和捕获 4 :3 aspect ratio but width > height,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54370002/

相关文章:

java - 使用主构造函数继承类

Android线程无法访问Main.xml

Android OpenCV 在 Optimus black (GB) 中对空白屏幕进行示例

android - 从 Android 中的视频中获取视频帧

java - 将毫秒转换为年数、月数和天数的最佳方法

android - 为什么 ContextThemeWrapper 现在仅限于 Support Library 组?

android - 在Unity中使用Facebook SDK上传截图

android - WakeLock 未锁定 GCM_LIB

kotlin - 为什么CoroutineScope.launch和Coroutine.async是扩展函数而不是CoroutineScope的成员函数?

kotlin - 如何从 Kotlin 的回调中分离 'hot' 事件流?